首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 3

Stack Overflow用户

发布于 2020-10-19 21:41:05

使用argmax和布尔数组将为您提供第一个True的索引。

代码语言:javascript
运行
复制
In [54]: q
Out[54]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [55]: q > q[0,0]
Out[55]: 
array([[False,  True,  True],
       [ True,  True,  True]], dtype=bool)

argmax可以使用一个轴/维参数。

代码语言:javascript
运行
复制
In [56]: np.argmax(q > q[0,0], 0)
Out[56]: array([1, 0, 0], dtype=int64)

也就是说,第一个True是对列零的索引一,对于第一和第二列是索引零。

代码语言:javascript
运行
复制
In [57]: np.argmax(q > q[0,0], 1)
Out[57]: array([1, 0], dtype=int64)

也就是说,第一个True是第一行的索引1,第一行的索引是零。

Q1.以上获得Q5中元素的第一个索引的正确方法是否大于Q50,0?

不,我将使用argmax1作为axis参数,然后从该结果中选择第一个项。

Q2.为什么这个还元组

您告诉它返回假值的-1,返回真值的Q5[0]项。

下面的

Q2 ...but返回正确的numpy数组?

你很幸运,选择了正确的指数。

票数 0
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

Stack Overflow用户

发布于 2020-10-19 22:05:03

numpy.where()类似于带有if的for循环。

代码语言:javascript
运行
复制
numpy.where(condition, values, new_value)

条件-就像if条件一样。

-要迭代的值

new_value -如果条件对于是正确的,它将更改为new_value

如果我们想为一个一维数组编写它,它应该如下所示:

代码语言:javascript
运行
复制
[xv if c else yv for c, xv, yv in zip(condition, x, y)]

示例:

代码语言:javascript
运行
复制
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90])

首先,我们创建一个从0到9 (0,1,2……7,8,9)的数组。

然后,我们将检查数组中所有从5到10的值,并将其乘以10。

因此,现在数组中小于5的所有值保持不变,所有大于10的值都保持不变。

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

https://stackoverflow.com/questions/64435299

复制
相关文章

相似问题

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