numpy.where 返回元组的目的是什么?

新手上路,请多包涵

当我运行这段代码时:

 import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(np.where(a > 2))

很自然地得到一个索引数组,其中 a > 2 ,即 [2, 3, 4, 5] ,但我们得到:

 (array([2, 3, 4, 5], dtype=int64),)

即第二个成员为空的元组。

然后,要获得 numpy.where 的“自然”答案,我们必须这样做:

 np.where(a > 2)[0]

这个元组有什么意义?在什么情况下有用?

注意:我在这里只谈论用例 numpy.where(cond) 而不是 numpy.where(cond, x, y) 也存在(参见文档)。

原文由 Basj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 596
2 个回答

numpy.where 返回一个元组,因为元组的每个元素都指向一个维度。

在二维中考虑这个例子:

 a = np.array([[1, 2, 3, 4, 5, 6],
              [-2, 1, 2, 3, 4, 5]])

print(np.where(a > 2))

(array([0, 0, 0, 0, 1, 1, 1], dtype=int64),
 array([2, 3, 4, 5, 3, 4, 5], dtype=int64))

如您所见,元组的第一个元素是指相关元素的第一个维度;第二个元素是指第二个维度。

这是一个约定 numpy 经常使用。当您询问数组的形状时,您也会看到它,即一维数组的形状将返回具有 1 个元素的元组:

 a = np.array([[1, 2, 3, 4, 5, 6],
              [-2, 1, 2, 3, 4, 5]])

print(a.shape, a.ndim)  # (2, 6) 2

b = np.array([1, 2, 3, 4, 5, 6])

print(b.shape, b.ndim)  # (6,) 1

原文由 jpp 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自 np.where 的文档

如果仅给出条件,则返回元组 condition.nonzero(),条件为 True 的索引

所以我们查看 “np.nonzero” 的文档

返回一个数组元组,一个对应于 a 的每个维度,包含该维度中非零元素的索引。 a 中的值始终按行优先、C 样式顺序进行测试和返回。可以通过以下方式获得相应的非零值:

那么这 np.where/np.nonzero 返回数组元组有何用处?我认为这与 索引多维数组 有关。

如果 我们有

y = np.arange(35).reshape(5,7)

我们可以做的

y[np.array([0,2,4]), np.array([0,1,2])]

选择 y[0, 0]y[2, 1]y[4, 2]

在这种情况下,如果索引数组具有匹配的形状,并且被索引数组的每个维度都有一个索引数组,则结果数组具有与索引数组相同的形状,并且值对应于每个索引集在索引数组中的位置。在此示例中,两个索引数组的第一个索引值都是 0,因此结果数组的第一个值是 y[0,0]。下一个值是 y[2,1],最后一个是 y[4,2]。

希望索引多维数组能够证明 np.nonzero/np.where 返回一个数组元组,以便稍后可以使用它来选择元素。

原文由 Tai 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题