如果数组中的两个连续行在第一列中具有相同的字符串,则将第一行中的其余条目设置为零

时间:2015-06-18 12:28:39

标签: python numpy

这是我目前的代码

y= n.genfromtxt('seguedata.txt', dtype=None, usecols = (0,1,2,5),)

for i in y:
if y[i][0] == y[i+1][0]:
    y[i][1]=0
    y[i][2]=0
    y[i][3]=0 

我收到了错误

IndexError                                Traceback (most recent call last)
<ipython-input-27-292d90264548> in <module>()
  1 for i in y:
2     if y[i][0] == y[i+1][0]:
  3         y[i][1]=0
  4         y[i][2]=0
  5         y[i][3]=0

IndexError: unsupported iterator index

segue数据是一个包含4列的大型数据集,其中第一列是字符串,另外3列是数字。如果两个连续的行具有相同的初始字符串,我想将第一行的值设置为零。

由于

1 个答案:

答案 0 :(得分:2)

打印i

for i in y:
    print(i)

你会看到它们是y的行,而不是整数。由于y是结构化数组,y可以用整数或列名索引,但不能用行值的元组索引,因此y[i]会引发错误

IndexError: unsupported iterator index

要解决问题,只需对代码进行最少的调整,就可以使用

for i in range(len(y)-1):
    if y[i][0] == y[i+1][0]:
        y[i][1]=0
        y[i][2]=0
        y[i][3]=0 

应尽可能避免逐个元素地修改NumPy数组。 在整个阵列或至少大片上操作将产生更好的效果 性能

在这种情况下,找到连续相等的行会更有效 值:

mask = (y['f0'][1:] == y['f0'][:-1])

然后在mask为True的行的每列中将所有值设置为零:

mask = np.concatenate([mask, [False]])
for col in y.dtype.names[1:]:
    y[col][mask] = 0