在numpy数组中替换负数为0时出现TypeError
我在尝试去掉这个数组中的负值时遇到了一个类型错误。之前运行这段代码时没有这个问题,我想那时候的数据里没有负值。我不明白数据怎么会变成一个元组……这是np.loadtxt的“特性”吗?是我在用zip函数交换列和行的时候把它变成元组的吗?我想知道怎么解决这个问题,但我也想了解一下数据为什么一开始会变成元组。另外,我觉得可能有比用“for”循环更优雅的方法来做这个,我也希望能得到一些相关的建议。
my_array = np.loadtxt(cw.my_Fname, delimiter=',', skiprows = 12, usecols = necessary_data_columns)
my_array = zip(*my_array)
i=0
for value in my_array[6]:
if value < 0:
my_array[6][i] = 0
i += 1
TypeError: 'tuple' object does not support item assignment
4 个回答
0
你需要先在一个列表上进行所有的修改,然后如果你想的话,可以把它再转换回元组。
my_array = np.loadtxt(cw.my_Fname, delimiter=',', skiprows = 12, usecols = necessary_data_columns)
my_array = zip(*my_array)
my_array = map(list, my_array) #convert list of tuples to list of lists
i=0
for value in my_array[6]:
if value < 0:
my_array[6][i] = 0
i += 1
2
你的问题是因为你执行了
my_array = zip(*my_array)
这段代码把 my_array
变成了一个元组,而不是一个numpy数组。所以当你尝试修改这个元组时,就会出现错误(元组是不可变的,不能被修改)。
你似乎想要对数组进行转置。使用numpy的话,只需要这样做:
my_array = my_array.T
这样之后,你的代码应该就能正常运行了。
不过,还有更好的方法来实现这个。
既然你在使用numpy,那就直接这样做:
my_array = np.loadtxt(cw.my_Fname, delimiter=',', skiprows = 12,
usecols = necessary_data_columns)
my_array = my_array.T
my_array[6][my_array[6] < 0] = 0
或者用更易读的方式:
my_array = np.loadtxt(cw.my_Fname, delimiter=',', skiprows = 12,
usecols = necessary_data_columns)
col = my_array[:,6]
col[col < 0] = 0
2
Python自带的zip
函数其实对numpy数组不太懂。
所以,建议使用numpy.transpose
:
In [11]: x
Out[11]:
array([[ 1., 2.],
[ 3., 4.],
[ 5., -1.]])
In [12]: zip(*x)
Out[12]: [(1.0, 3.0, 5.0), (2.0, 4.0, -1.0)]
In [13]: x.transpose()
Out[13]:
array([[ 1., 3., 5.],
[ 2., 4., -1.]])
这样之后,你就可以随意修改你的数组了。
3
如果你想把所有的负数替换成零,只需要这样做:
my_array = np.clip(my_array, 0, np.inf)
如果你只想在某一特定的列中进行替换,可以这样:
my_array[:, col] = np.clip(my_array[:, col], 0, np.inf)
注意:你可以用 my_array.T
来转置你的 numpy 数组,而不是用 zip(*my_array)
。使用 zip
会生成你发现的元组...
当你需要转置 np.loadtxt()
的结果时,只需传入 unpack=True
,这样就能得到相同的结果:
my_array = np.loadtxt(cw.my_Fname, delimiter=',', skiprows=12,
usecols=necessary_data_columns, unpack=True)