尝试用0替换负数时,numpy数组中的TypeError

时间:2014-04-25 13:29:12

标签: python numpy

当我尝试消除此数组中的负值时,我收到了一个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 :(得分:3)

如果您想将所有负数替换为零,请执行以下操作:

my_array = np.clip(my_array, 0, np.inf)

如果您只想在特定列中执行此操作:

my_array[:, col] = np.clip(my_array[:, col], 0, np.inf)

注意:您可以使用my_array.T代替zip(*my_array)来转置您的numpy数组,zip生成您发现的元组... < / p>

当您需要转置np.loadtxt()的结果时,只需传递unpack=True即可获得相同的结果:

my_array = np.loadtxt(cw.my_Fname, delimiter=',', skiprows=12,            
                      usecols=necessary_data_columns, unpack=True)

答案 1 :(得分: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.]])

之后,您可以随意修改阵列。

答案 2 :(得分: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

答案 3 :(得分: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