索引错误,如果列中有一个值,则从数组中删除行。

3

我有一个有四列的数组'x'。

对于每一行,如果第四列的值为1,则我想要删除整行:

x = np.array([[1,2,3,0],[11,2,3,24],[1,22,3,1],[1,22,3,1], [5,6,7,8], [9,10,11,1]])
for i in range(0,len(x)):
    if x[i][4]==0:
        x=np.delete(x, i,0)

我遇到了以下错误:
跟踪(最近的调用在最上面): 文件 "", 第2行,在 如果x [i] [4] == 0: IndexError:索引超出范围

1
顺便提一下,使用numpy数组时,通常应该使用x[i, 4]而不是x[i][4]。第一个版本直接访问元素,而不是访问行,然后请求元素,因此它可以更有效率——但更重要的是,在开始做更高级的操作时,它更加灵活。 - abarnert
另外,len(x) 是一件奇怪的事情。它确实可以工作,但如果你想要特定轴的大小,请请求该轴的大小,而不是请求将数组视为行序列的长度。 - abarnert
如果你想要最后一个项目(列或行或其他),你不需要计算行数并使用该数字:相反,从末尾开始计数。如果有4个项目,则最后一个项目是x [3]x [-1] - askewchan
3个回答

4

你试图用 [4] 引用第四列,但实际上它是从零开始的,所以应该使用 [3]


3

您可以使用索引

>>> x[x[:,3] != 1]
array([[ 1,  2,  3,  0],
       [11,  2,  3, 24],
       [ 5,  6,  7,  8]])

@West1234 如果不清楚的话,这只是显示列“3”不等于“1”的行。它不会从数组中删除它们,所以稍后“x”仍将拥有所有行。 - askewchan

0
列表的索引从0开始。因此,由于有4个元素,索引为:0,1,2,3。所以,如果您需要检查第4个元素,请使用索引3。
if x[i][3]==0:
     pass

这将会起作用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接