>>> 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)
我需要找到值为true的行或e
中值大于15的行。我可以使用for循环进行迭代,但是,我想知道是否有一种方法可以让numpy更有效地做到这一点?
4条答案
按热度按时间qyyhg6bp1#
若要获取至少有一项大于15的行号:
emeijp432#
可以使用
nonzero
函数。它返回给定输入的非零索引。轻松之路
要查看更清晰的索引,请使用
transpose
方法:不坏的方式
或者是干净的方式:
os8fio9y3#
**一个简单而干净的方法:**使用
np.argwhere
来按元素分组索引,而不是像np.nonzero(a)
那样按维度分组(即np.argwhere
为每个非零元素返回一行)。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]
。另一个例子:
xmjla07d4#
当您只需要行idx时,我更喜欢
np.flatnonzero(arr)
而不是nonzero()
选项。arr.nonzero()
可以工作,但是它返回一个元组而不是一个数组。flatnonzero()
等于np.nonzero(np.ravel(arr))[0]
。正如在评论中提到的,
np.where()
不被NumPy文档所鼓励。