在numpy数组中替换负数为0时出现TypeError

2 投票
4 回答
568 浏览
提问于 2025-04-18 04:14

我在尝试去掉这个数组中的负值时遇到了一个类型错误。之前运行这段代码时没有这个问题,我想那时候的数据里没有负值。我不明白数据怎么会变成一个元组……这是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)

撰写回答