Python 理解numpy.在哪里

Python 理解numpy.在哪里,python,arrays,numpy,Python,Arrays,Numpy,我想得到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(

我想得到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]
1
Q1.是获得
Q5[0]
中元素的第一个索引大于
Q5[0,0]
的正确方法吗

我更关心的是
np.where(Q5[0]>Q5[0,0])
返回元组
(数组([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

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是第0列的索引1,第1列和第2列的索引0

In [57]: np.argmax(q > q[0,0], 1)
Out[57]: array([1, 0], dtype=int64)
也就是说,第一个True是第0行的索引1和第1行的索引0


问题1。以上是获得Q5[0]中元素的第一个索引大于Q5[0,0]的正确方法吗

否我将使用
argmax
1
作为
axis
参数,然后从该结果中选择第一项

问题2。为什么返回元组

您告诉它返回
-1
作为假值,返回
Q5[0]
项目作为真值

Q2…但下面返回的是正确的numpy数组吗

>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)
array([-1,  2,  3])
你很幸运,选择了正确的索引

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的位置

另一个测试有几个是正确的

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,
非零
不是查找“第一个”的测试工具,因为它必须查找所有

非零元组可以通过
转置
转换为2d数组。实际上,从这个数组中获取“第一个”可能更容易:

In [73]: np.argwhere((A%3)==1)
Out[73]: 
array([[0, 0],
       [1, 0],
       [2, 0]])

您正在查看一个一维阵列,一行:

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])
因此,无论是搜索一维数组还是二维数组(或3或4),
非零
返回一个元组,每个维度有一个数组元素。这样,它总是可以用来索引大小相同的数组。一维元组可能看起来是多余的,但它与其他维度的结果是一致的

当试图理解这样的操作时,请仔细阅读文档,并查看各个步骤。这里我看一下条件矩阵、
非零
结果及其各种用途。

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

numpy.where(condition, values, new_value)
条件-就像if条件一样。
-要迭代的值
新值-如果条件对于为真,则其将更改为新值


如果我们想为一维数组编写它,它应该是这样的:
[xv if c else yv for c, xv, yv in zip(condition, x, y)]

例子: a=np.arange(10) >>>a 数组([0,1,2,3,4,5,6,7,8,9]) >>>式中(a<5,a,10*a) 数组([0,1,2,3,4,50,60,70,80,90])
首先,我们创建一个数字从0到9(0,1,2…7,8,9)的数组
然后我们检查数组中大于5的所有值,并将它们的值乘以10。

所以现在数组中所有小于5的值保持不变,所有大于10的值乘以Q5[0]中元素的第一个索引-你只想知道前两个的索引?所以
非零()
不能用于我的示例,对吗?另外,你能具体回答我的问题Q1和Q2吗?因此,我相信我可以对我的具体示例做同样的回答,如
np.argmax(Q5[0]>Q5[0][0])
,对吗?另外,你能具体回答我的问题Q1和Q2吗?