在 NumPy 数组中查找等于零的元素的索引

NumPy 有一个高效的函数/方法 nonzero()来识别 ndarray对象中非零元素的索引。获得 值为零的元素的指数的最有效的方法是什么?

343666 次浏览

Numpy.where () 是我的最爱。

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.where(x == 0)[0]
array([1, 3, 5])

方法 where返回一个 ndarray 元组,每个元组对应于输入的不同维度。因为输入是一维的,所以 [0]解压元组的唯一元素。

您可以使用以下命令搜索任何标量条件:

>>> a = np.asarray([0,1,2,3,4])
>>> a == 0 # or whatver
array([ True, False, False, False, False], dtype=bool)

它将返回数组作为条件的布尔掩码。

如果您使用的是一维数组,那么有一个语法糖:

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.flatnonzero(x == 0)
array([1, 3, 5])

您还可以通过在条件的布尔掩码上使用 nonzero(),因为 False也是一种零。

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])


>>> x==0
array([False, True, False, True, False, True, False, False, False, False, False], dtype=bool)


>>> numpy.nonzero(x==0)[0]
array([1, 3, 5])

它所做的与 mtrw的方法完全相同,但它更多的是与问题相关;)

import numpy as np


x = np.array([1,0,2,3,6])
non_zero_arr = np.extract(x>0,x)


min_index = np.amin(non_zero_arr)
min_value = np.argmin(non_zero_arr)

np.argwhere,

import numpy as np
arr = np.array([[1,2,3], [0, 1, 0], [7, 0, 2]])
np.argwhere(arr == 0)

它以行的形式返回所有找到的索引:

array([[1, 0],    # Indices of the first zero
[1, 2],    # Indices of the second zero
[2, 1]],   # Indices of the third zero
dtype=int64)

我会这么做:

>>> x = np.array([[1,0,0], [0,2,0], [1,1,0]])
>>> x
array([[1, 0, 0],
[0, 2, 0],
[1, 1, 0]])
>>> np.nonzero(x)
(array([0, 1, 2, 2]), array([0, 1, 0, 1]))


# if you want it in coordinates
>>> x[np.nonzero(x)]
array([1, 2, 1, 1])
>>> np.transpose(np.nonzero(x))
array([[0, 0],
[1, 1],
[2, 0],
[2, 1])

可以使用 numpy.nonzero 查找零。

>>> import numpy as np
>>> x = np.array([1,0,2,0,3,0,0,4,0,5,0,6]).reshape(4, 3)
>>> np.nonzero(x==0)  # this is what you want
(array([0, 1, 1, 2, 2, 3]), array([1, 0, 2, 0, 2, 1]))
>>> np.nonzero(x)
(array([0, 0, 1, 2, 3, 3]), array([0, 2, 1, 1, 0, 2]))
import numpy as np
arr = np.arange(10000)
arr[8000:8900] = 0


%timeit np.where(arr == 0)[0]
%timeit np.argwhere(arr == 0)
%timeit np.nonzero(arr==0)[0]
%timeit np.flatnonzero(arr==0)
%timeit np.amin(np.extract(arr != 0, arr))
23.4 µs ± 1.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
34.5 µs ± 680 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
23.2 µs ± 447 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
27 µs ± 506 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
109 µs ± 669 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)