43

在 Numpy 中nonzero(a)where(a)argwhere(a)a一个 numpy 数组,似乎都返回了数组的非零索引。这三个调用有什么区别?

  • argwhere文档上说:

    np.argwhere(a)是一样的np.transpose(np.nonzero(a))

    为什么有一个只转换输出的整个函数nonzero?什么时候它会如此有用以至于它值得一个单独的功能?

  • where(a)和 和有什么区别nonzero(a)?他们不会返回完全相同的结果吗?

4

2 回答 2

15

nonzero并且argwhere两者都为您提供有关元素在数组中的位置的信息Truewhere工作方式与您发布的表单相同nonzero,但它有第二种形式:

np.where(mask,a,b)

可以粗略地将其视为条件表达式的 numpy“ufunc”版本:

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

(适当广播ab)。

两者 nonzero而言argwhere,它们在概念上是不同的。 nonzero被构造为返回一个可用于索引的对象。如果 0 是稀疏的,这可能比创建整个布尔掩码更轻:

mask = a == 0  # entire array of bools
mask = np.nonzero(a)

现在您可以使用该掩码来索引其他数组等。但是,实际上,从概念上确定哪些索引对应于 0 元素并不是很好。这就是argwhere进来的地方。

于 2013-04-12T16:58:38.547 回答
10

我无法评论拥有一个单独的便利函数来转换另一个结果的有用性,但我可以评论wherevs 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,但这至少解释了两者的不同之处。

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

于 2013-04-12T16:54:11.790 回答