我希望获得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: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结果,以及它的各种用途。
https://stackoverflow.com/questions/64435299
复制相似问题