解决'tuple'对象不支持元素赋值问题:二维数组局部最大值索引存储
解决'tuple' object does not support item assignment的报错
这个报错主要有两个核心原因,咱们一步步来搞定:
1. 先修正maximums的初始化方式
你大概率是把maximums定义成了元组(比如maximums = ()或者maximums = tuple(...)),而元组是Python里的不可变类型,完全不支持maximums[i] = ...这种赋值操作。
你需要把maximums改成可变的序列类型,推荐两种方式:
- 用列表初始化(最常用,后续处理灵活):
# 提前创建一个包含200个空元素的列表 maximums = [[] for _ in range(200)] - 或者用numpy对象数组(适合后续做批量数值处理):
import numpy as np maximums = np.empty(200, dtype=object)
2. 正确处理argrelextrema的返回值
scipy.signal.argrelextrema的返回值是一个元组——哪怕你传入的是一维数组(比如b1[i]),它也会返回一个包含索引数组的单元素元组(格式类似(array([1,3,5]),))。如果直接把这个元组赋值,虽然不会触发当前报错,但后续处理索引时会额外踩坑。
所以你需要提取元组里的索引数组,也就是加个[0]:
修正后的完整代码
import scipy.signal import numpy as np # 假设b1是shape为(200, N)的二维数组 b1 = np.random.rand(200, 100) maximums = [[] for _ in range(200)] for i in range(200): # 提取当前一维数组对应的局部最大值索引 peak_indices = scipy.signal.argrelextrema(b1[i], np.greater)[0] # 把索引存入maximums的对应位置 maximums[i] = peak_indices.tolist() # 转成列表,或者直接存numpy数组也可以
额外小提示
- 如果
b1的第一维长度不一定是200,建议用range(len(b1))代替range(200),这样代码更鲁棒,不会因为数组长度变化报错。 - 如果你需要保存的是局部最大值的数值而不是索引,可以用
b1[i][peak_indices]来获取。
内容的提问来源于stack exchange,提问作者bbb
相关产品推荐
相关产品推荐

