我希望获得numpy数组元素的第一个索引,它比该数组的某些特定元素更大。我试过以下几点:
>>> 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]
1Q1.是在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数组?
>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)
array([-1, 2, 3])这样我就可以直接索引:
>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)[1]
2发布于 2020-10-19 21:41:05
使用argmax和布尔数组将为您提供第一个True的索引。
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可以使用一个轴/维参数。
In [56]: np.argmax(q > q[0,0], 0)
Out[56]: array([1, 0, 0], dtype=int64)也就是说,第一个True是对列零的索引一,对于第一和第二列是索引零。
In [57]: np.argmax(q > q[0,0], 1)
Out[57]: array([1, 0], dtype=int64)也就是说,第一个True是第一行的索引1,第一行的索引是零。
Q1.以上获得Q5中元素的第一个索引的正确方法是否大于Q50,0?
不,我将使用argmax和1作为axis参数,然后从该结果中选择第一个项。
Q2.为什么这个还元组
您告诉它返回假值的-1,返回真值的Q5[0]项。
下面的
Q2 ...but返回正确的numpy数组?
你很幸运,选择了正确的指数。
发布于 2020-10-19 21:42:04
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。
生成一个布尔数组:
In [63]: A==6
Out[63]:
array([[False, False, False],
[False, False, True],
[False, False, False]])找到正确的地方:
In [64]: np.nonzero(A==6)
Out[64]: (array([1]), array([2]))结果是一个元组,条件的每个维度都有一个元素。每个元素都是一个索引数组,它们一起定义了True的位置
另一个带有几个True的测试
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]))使用元组索引原始数组:
In [67]: A[np.nonzero((A%3)==1)]
Out[67]: array([1, 4, 7])使用3个参数where创建一个新数组,该数组混合了来自A和A+10的值
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数组。实际上,从这个数组中获得“第一个”可能更容易:
In [73]: np.argwhere((A%3)==1)
Out[73]:
array([[0, 0],
[1, 0],
[2, 0]])您正在查看一个一维数组,一行A:
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结果,以及它的各种用途。
发布于 2020-10-19 22:05:03
numpy.where()类似于带有if的for循环。
numpy.where(condition, values, new_value)条件-就像if条件一样。
值-要迭代的值
new_value -如果条件对于值是正确的,它将更改为new_value
如果我们想为一个一维数组编写它,它应该如下所示:
[xv if c else yv for c, xv, yv in zip(condition, x, y)]示例:
>>> 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的值都保持不变。
https://stackoverflow.com/questions/64435299
复制相似问题