在Numpy中,nonzero(a)
,where(a)
和argwhere(a)
,a
是一个numpy数组,所有似乎都返回数组的非零索引。这三个电话之间有什么区别?
在argwhere
文档上说:
np.argwhere(a)
与np.transpose(np.nonzero(a))
相同。
为什么整个函数只转换nonzero
的输出?什么时候它应该如此有用,它应该有一个单独的功能?
where(a)
和nonzero(a)
之间的区别如何?他们不会返回完全相同的结果吗?
答案 0 :(得分:11)
nonzero
和argwhere
都会向您提供有关元素在True
中的位置的信息。 where
与您发布的表单中的nonzero
的工作方式相同,但它有第二种形式:
np.where(mask,a,b)
可以粗略地认为是条件表达式的numpy“ufunc”版本:
a[i] if mask[i] else b[i]
(适当广播a
和b
)。
就 {/ em> nonzero
和argwhere
而言,它们在概念上是不同的。 nonzero
的结构是返回一个可用于索引的对象。如果0是稀疏的,那么这可能比创建整个布尔掩码更轻:
mask = a == 0 # entire array of bools
mask = np.nonzero(a)
现在你可以使用该掩码来索引其他数组等。但是,事实上,从概念上来说,找出哪些索引对应于0个元素并不是很好。这就是argwhere
的用武之地。
答案 1 :(得分:9)
我无法评论使用单独的便利功能来转换另一个的结果,但我可以对where
vs nonzero
发表评论。在最简单的用例中,where
确实与nonzero
相同。
>>> np.where(np.array([[0,4],[4,0]]))
(array([0, 1]), array([1, 0]))
>>> np.nonzero(np.array([[0,4],[4,0]]))
(array([0, 1]), array([1, 0]))
或
>>> a = np.array([[1, 2],[3, 4]])
>>> np.where(a == 3)
(array([1, 0]),)
>>> np.nonzero(a == 3)
(array([1, 0]),)
where
与nonzero
的不同之处在于,如果某些条件为a
且数组True
,则希望从数组b
中选择元素当条件为False
时。
>>> a = np.array([[6, 4],[0, -3]])
>>> b = np.array([[100, 200], [300, 400]])
>>> np.where(a > 0, a, b)
array([[6, 4], [300, 400]])
同样,我无法解释为什么他们将nonzero
功能添加到where
,但这至少解释了两者的不同之处。
编辑:修正了第一个例子......我之前的逻辑不正确