numpy get index where value is true

>>> ex=np.arange(30)
>>> e=np.reshape(ex,[3,10])
>>> e
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]])
>>> e>15
array([[False, False, False, False, False, False, False, False, False,
False],
[False, False, False, False, False, False,  True,  True,  True,
True],
[ True,  True,  True,  True,  True,  True,  True,  True,  True,
True]], dtype=bool)

I need to find the rows that have true or rows in e whose value are more than 15. I could iterate using a for loop, however, I would like to know if there is a way numpy could do this more efficiently?

241945 次浏览

要获取至少一个项大于15的行号:

>>> np.where(np.any(e>15, axis=1))
(array([1, 2], dtype=int64),)

您可以使用 nonzero函数。它返回给定输入的非零索引。

简单方法

>>> (e > 15).nonzero()


(array([1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), array([6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

为了看到更清晰的指数,使用 transpose方法:

>>> numpy.transpose((e>15).nonzero())


[[1 6]
[1 7]
[1 8]
[1 9]
[2 0]
...

不坏的方式

>>> numpy.nonzero(e > 15)


(array([1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]), array([6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

或干净的方式:

>>> numpy.transpose(numpy.nonzero(e > 15))


[[1 6]
[1 7]
[1 8]
[1 9]
[2 0]
...

一种简单而干净的方法: 使用 np.argwhere按元素对索引进行分组,而不是像 np.nonzero(a)那样使用维度(即,np.argwhere为每个非零元素返回一行)。

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.argwhere(a>4)
array([[5],
[6],
[7],
[8],
[9]])

np.argwhere(a)np.transpose(np.nonzero(a))几乎相同,但是它为0-d 数组生成正确形状的结果。

注意: 不能使用 a(np.argwhere(a>4))获得 a中的对应值。推荐的方法是使用 a[(a>4).astype(bool)]a[(a>4) != 0]而不是 a[np.nonzero(a>4)],因为它们可以正确处理0-d 数组。有关更多细节,请参见 文件。从下面的例子中可以看出,a[(a>4).astype(bool)]a[(a>4) != 0]可以简化为 a[a>4]

另一个例子:

>>> a = np.array([5,-15,-8,-5,10])
>>> a
array([  5, -15,  -8,  -5,  10])
>>> a > 4
array([ True, False, False, False,  True])
>>> a[a > 4]
array([ 5, 10])
>>> a = np.add.outer(a,a)
>>> a
array([[ 10, -10,  -3,   0,  15],
[-10, -30, -23, -20,  -5],
[ -3, -23, -16, -13,   2],
[  0, -20, -13, -10,   5],
[ 15,  -5,   2,   5,  20]])
>>> a = np.argwhere(a>4)
>>> a
array([[0, 0],
[0, 4],
[3, 4],
[4, 0],
[4, 3],
[4, 4]])
>>> for i,j in a: print(i,j)
...
0 0
0 4
3 4
4 0
4 3
4 4
>>>

当您只需要行 idx 时,我更喜欢 np.flatnonzero(arr)而不是 nonzero()选项。arr.nonzero()可以工作,但它返回的是元组而不是数组。flatnonzero()相当于 np.nonzero(np.ravel(arr))[0]

正如注释中提到的,NumPy 文档不鼓励使用 np.where()