当我尝试消除此数组中的负值时,我收到了一个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
答案 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