在for循环内删除np数组中的行

时间:2018-11-02 01:38:17

标签: python arrays numpy rowdeleting

我正在尝试删除列表“ a”中包含的多个2D数组中所有一个或多个非零元素的行。

当我在“ i”循环外运行该方法时,此方法有效,但不能整体使用。我知道我无法删除要迭代的行,但我相信在这种情况下我不会这样做,因为我只是删除a中包含的数组中的行,而不是数组本身。

for i in range(len(a)):
  del_idx=[]
  for j in range(len(a[i])):
    nonzero=np.nonzero(a[i][j])
    nonzero_len=len(nonzero[0]) #because np.nonzero outputs a tuple
    if nonzero_len<=1:
        del_idx.append(j)
    else:
        continue
  np.delete(a[i],(del_idx),axis=0)

有人知道这是怎么回事吗?如果这确实不起作用,如何在不使用循环的情况下删除这些元素?这是Python 2.7

谢谢!

2 个答案:

答案 0 :(得分:1)

当矢量化操作可用时,您应该避免使用NumPy进行for循环。例如,在这里,您可以使用布尔索引:

import numpy as np

np.random.seed(0)

A = np.random.randint(0, 2, (10, 3))

res = A[(A != 0).sum(1) > 1]

array([[0, 1, 1],
       [0, 1, 1],
       [1, 1, 1],
       [1, 1, 0],
       [1, 1, 0],
       [0, 1, 1],
       [1, 1, 0]])

可以对数组列表中的每个数组应用相同的逻辑。

答案 1 :(得分:0)

您可以使用np.where()进行索引:

a = np.random.randint(0, 2, size=(10,10))
# array([[1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
#    [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
#    [1, 0, 1, 0, 0, 1, 0, 0, 0, 1],
#    [1, 0, 0, 1, 0, 1, 0, 1, 1, 0],
#    [1, 0, 0, 0, 1, 0, 1, 1, 0, 1],
#    [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
#    [1, 0, 0, 1, 1, 0, 0, 1, 1, 0],
#    [0, 0, 0, 1, 0, 1, 0, 1, 1, 1],
#    [0, 0, 1, 1, 0, 0, 1, 0, 1, 0],
#    [1, 1, 0, 0, 0, 1, 0, 0, 1, 1]])

np.where(np.count_nonzero(a, axis=1)<5)    # In your case, should be > 1
# (array([2, 5, 8]),)

a[np.where(np.count_nonzero(a, axis=1)<5)] # Returns the array you wanted
# array([[1, 0, 1, 0, 0, 1, 0, 0, 0, 1],
#    [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
#    [0, 0, 1, 1, 0, 0, 1, 0, 1, 0]])