非零(a),其中(a)和argwhere(a)之间的差异。什么时候用哪个?

时间:2013-04-12 16:42:50

标签: python numpy

在Numpy中,nonzero(a)where(a)argwhere(a)a是一个numpy数组,所有似乎都返回数组的非零索引。这三个电话之间有什么区别?

  • argwhere文档上说:

      

    np.argwhere(a)np.transpose(np.nonzero(a))相同。

    为什么整个函数只转换nonzero的输出?什么时候它应该如此有用,它应该有一个单独的功能?

  • where(a)nonzero(a)之间的区别如何?他们不会返回完全相同的结果吗?

2 个答案:

答案 0 :(得分:11)

nonzeroargwhere都会向您提供有关元素在True中的位置的信息。 where与您发布的表单中的nonzero的工作方式相同,但它有第二种形式:

np.where(mask,a,b)

可以粗略地认为是条件表达式的numpy“ufunc”版本:

a[i] if mask[i] else b[i]

(适当广播ab)。

{/ em> nonzeroargwhere而言,它们在概念上是不同的。 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]),)

wherenonzero的不同之处在于,如果某些条件为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,但这至少解释了两者的不同之处。

编辑:修正了第一个例子......我之前的逻辑不正确