在for循环中删除np数组中的行
Deleting rows in np array inside a for loop
我正在尝试删除列表 'a' 中包含的多个二维数组中包含一个或更少非零元素的所有行。
当我 运行 它在 '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
谢谢!
当向量化操作可用时,您应该致力于避免 for
使用 NumPy 循环。例如,这里可以使用布尔索引:
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]])
可以对数组列表中的每个数组应用相同的逻辑。
您可以使用 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]])
我正在尝试删除列表 'a' 中包含的多个二维数组中包含一个或更少非零元素的所有行。
当我 运行 它在 '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
谢谢!
当向量化操作可用时,您应该致力于避免 for
使用 NumPy 循环。例如,这里可以使用布尔索引:
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]])
可以对数组列表中的每个数组应用相同的逻辑。
您可以使用 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]])