5

我正在尝试仅包含 NumPy 数组中的零的所有行。例如,我想[0,0]

n = np.array([[1,2], [0,0], [5,6]])

并留下:

np.array([[1,2], [5,6]])
4

4 回答 4

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
于 2012-04-12T08:48:15.533 回答
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.

于 2012-04-12T09:06:35.553 回答
3

You can use numpy.delete to remove specific rows or columns.

For example:

n = [[1,2], [0,0], [5,6]]

np.delete(n, 1, axis=0)

The output will be:

array([[1, 2],
       [5, 6]])
于 2012-04-12T08:49:52.087 回答
2

根据值删除,这是一个Object。
这样做:

>>> 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]])
于 2017-01-04T04:01:46.853 回答