我正在尝试所有只包含NumPy数组中的零的行。例如,我想从
中删除[0,0]
n = np.array([[1,2], [0,0], [5,6]])
并留下:
np.array([[1,2], [5,6]])
答案 0 :(得分:10)
从numpy表中删除第二行:
import numpy
n = numpy.array([[1,2],[0,0],[5,6]])
new_n = numpy.delete(n, 1, axis=0)
删除仅包含0的行:
import numpy
n = numpy.array([[1,2],[0,0],[5,6]])
idxs = numpy.any(n != 0, axis=1) # index of rows with at least one non zero value
n_non_zero = n[idxs, :] # selection of the wanted rows
答案 1 :(得分:4)
如果你想删除任何只包含零的行,我能想到的最快的方法是:
n = numpy.array([[1,2], [0,0], [5,6]])
keep_row = n.any(axis=1) # Index of rows with at least one non-zero value
n_non_zero = n[keep_row] # Rows to keep, only
这比Simon的答案要快得多,因为n.any()
一旦遇到任何非零值就停止检查每一行的值(在Simon的回答中,每行的所有元素首先与零进行比较) ,这导致不必要的计算)。
如果您需要删除具有特定值的行(而不是仅删除仅包含零的行),则以下是答案的概括:
n = numpy.array([[1,2], [0,0], [5,6]])
to_be_removed = [0, 0] # Can be any row values: [5, 6], etc.
other_rows = (n != to_be_removed).any(axis=1) # Rows that have at least one element that differs
n_other_rows = n[other_rows] # New array with rows equal to to_be_removed removed.
请注意,此解决方案尚未完全优化:即使to_be_removed
的第一个元素不匹配,n
的其余行元素也会与to_be_removed
的行元素进行比较(如西蒙的回答)。
我很想知道是否有一个简单有效的NumPy解决方案来解决删除具有特定值的行的更普遍的问题。
使用cython循环可能是一个快速的解决方案:对于每一行,只要行中的一个元素与to_be_removed
中的对应元素不同,就可以停止元素比较。
答案 2 :(得分:3)
您可以使用numpy.delete
删除特定的行或列。
例如:
n = [[1,2], [0,0], [5,6]]
np.delete(n, 1, axis=0)
输出将是:
array([[1, 2],
[5, 6]])
答案 3 :(得分:2)
根据值删除,即对象 这样做:
>>> n
array([[1, 2],
[0, 0],
[5, 6]])
>>> bl=n==[0,0]
>>> bl
array([[False, False],
[ True, True],
[False, False]], dtype=bool)
>>> bl=np.any(bl,axis=1)
>>> bl
array([False, True, False], dtype=bool)
>>> ind=np.nonzero(bl)[0]
>>> ind
array([1])
>>> np.delete(n,ind,axis=0)
array([[1, 2],
[5, 6]])