NumPy 有一个高效的函数/方法 nonzero()来识别 ndarray对象中非零元素的索引。获得 做值为零的元素的指数的最有效的方法是什么?
nonzero()
ndarray
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]解压元组的唯一元素。
where
[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也是一种零。
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的方法完全相同,但它更多的是与问题相关;)
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,
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)