首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解numpy.where

理解numpy.where
EN

Stack Overflow用户
提问于 2020-10-19 21:28:00
回答 3查看 61关注 0票数 0

我希望获得numpy数组元素的第一个索引,它比该数组的某些特定元素更大。我试过以下几点:

代码语言:javascript
运行
复制
>>> Q5=[[1,2,3],[4,5,6]]
>>> Q5 = np.array(Q5)
>>> Q5[0][Q5>Q5[0,0]]
array([2, 3])
>>> np.where(Q5[0]>Q5[0,0])
(array([1, 2], dtype=int32),)
>>> np.where(Q5[0]>Q5[0,0])[0][0]
1

Q1.是在Q5[0]中获得大于Q5[0,0]的元素的第一个索引的正确方法。

我更关心的是np.where(Q5[0]>Q5[0,0])返回元组(array([1, 2], dtype=int32),),因此需要在np.where(Q5[0]>Q5[0,0])[0][0]结束时加倍索引[0][0]

Q2.为什么返回元组,但在下面返回正确的numpy数组?

代码语言:javascript
运行
复制
>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)
array([-1,  2,  3])

这样我就可以直接索引:

代码语言:javascript
运行
复制
>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)[1]
2
EN

Stack Overflow用户

发布于 2020-10-19 21:42:04

代码语言:javascript
运行
复制
In [58]: A = np.arange(1,10).reshape(3,3)
In [59]: A.shape
Out[59]: (3, 3)
In [60]: A
Out[60]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

有条件的np.where实际上是np.nonzero

生成一个布尔数组:

代码语言:javascript
运行
复制
In [63]: A==6
Out[63]: 
array([[False, False, False],
       [False, False,  True],
       [False, False, False]])

找到正确的地方:

代码语言:javascript
运行
复制
In [64]: np.nonzero(A==6)
Out[64]: (array([1]), array([2]))

结果是一个元组,条件的每个维度都有一个元素。每个元素都是一个索引数组,它们一起定义了True的位置

另一个带有几个True的测试

代码语言:javascript
运行
复制
In [65]: (A%3)==1
Out[65]: 
array([[ True, False, False],
       [ True, False, False],
       [ True, False, False]])
In [66]: np.nonzero((A%3)==1)
Out[66]: (array([0, 1, 2]), array([0, 0, 0]))

使用元组索引原始数组:

代码语言:javascript
运行
复制
In [67]: A[np.nonzero((A%3)==1)]
Out[67]: array([1, 4, 7])

使用3个参数where创建一个新数组,该数组混合了来自AA+10的值

代码语言:javascript
运行
复制
In [68]: np.where((A%3)==1,A+10, A)
Out[68]: 
array([[11,  2,  3],
       [14,  5,  6],
       [17,  8,  9]])

如果条件有多个True,nonzero并不是查找“第一个”的测试工具,因为它必须找到全部。

非零元组可以转换为带有transpose的2d数组。实际上,从这个数组中获得“第一个”可能更容易:

代码语言:javascript
运行
复制
In [73]: np.argwhere((A%3)==1)
Out[73]: 
array([[0, 0],
       [1, 0],
       [2, 0]])

您正在查看一个一维数组,一行A:

代码语言:javascript
运行
复制
In [77]: A[0]>A[0,0]
Out[77]: array([False,  True,  True])
In [78]: np.nonzero(A[0]>A[0,0])
Out[78]: (array([1, 2]),)            # 1 element tuple
In [79]: np.argwhere(A[0]>A[0,0])
Out[79]: 
array([[1],
       [2]])
In [81]: np.where(A[0]>A[0,0], 100, 0)     # 3 argument where
Out[81]: array([  0, 100, 100])

因此,无论您搜索的是一维数组还是2d (或3或4),nonzero都会返回一个元组,每个维度都有一个数组元素。这样,它总是可以用于索引大小相同的数组。一维元组看起来可能是多余的,但它与其他维度的结果是一致的。

当尝试理解这样的操作时,请仔细阅读文档,并查看各个步骤。这里我看条件矩阵,nonzero结果,以及它的各种用途。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64435299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档