Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找numpy数组中每一行的最大值以及相同大小的另一个数组中对应的元素_Python_Arrays_Numpy - Fatal编程技术网

Python 查找numpy数组中每一行的最大值以及相同大小的另一个数组中对应的元素

Python 查找numpy数组中每一行的最大值以及相同大小的另一个数组中对应的元素,python,arrays,numpy,Python,Arrays,Numpy,我是Python新手,仍然不能称自己为Python程序员。说到这里,如果我的问题没有任何意义,请耐心听我说 问题: 我有两个大小相同的numpy数组,例如A和B,其中A.shape等于B.shape,它们都等于(51000),我想找到A中每一行的最大值和B中对应的元素。例如,如果在A的第四行,最大元素索引是104,然后我想找到数组B中第四行的第104个元素,其余行也是如此 我知道我可以通过在行上循环来完成,但我想知道是否有更优雅的方式来完成。例如,如果我在MATLAB中执行此操作,我将编写以下代

我是Python新手,仍然不能称自己为Python程序员。说到这里,如果我的问题没有任何意义,请耐心听我说

问题: 我有两个大小相同的numpy数组,例如A和B,其中A.shape等于B.shape,它们都等于(51000),我想找到A中每一行的最大值和B中对应的元素。例如,如果在A的第四行,最大元素索引是104,然后我想找到数组B中第四行的第104个元素,其余行也是如此

我知道我可以通过在行上循环来完成,但我想知道是否有更优雅的方式来完成。例如,如果我在MATLAB中执行此操作,我将编写以下代码:

B(bsxfun(@eq,A,max(A,[],2)))

如果有人能帮我找到正确的方向,我将不胜感激。

下面是做同样事情的
numpy
习惯用法:

b[np.arange(len(a)), np.argmax(a, axis=1)]
例如:

>>> a = np.array([
    [1, 2, 0],
    [2, 1, 0],
    [0, 1, 2]
    ])
>>> b = np.array([
    [1, 2, 3],
    [1, 2, 3],
    [1, 2, 3]
    ])
>>> b[np.arange(len(a)), np.argmax(a, axis=1)]
array([2, 1, 3])
作为一个爱好者,看到人们试图将相同的功能复制到其他编程语言中是件好事。现在,
bsxfun
基本上是一种机制,它也存在于NumPy中。在NumPy中,它是通过使用或简单地使用
None
创建单例维度来实现的

回到上下文中的问题,可以实现基于广播的
等效解决方案,如示例运行所示-

In [128]: A
Out[128]: 
array([[40, 63, 67, 65, 19],
       [85, 55, 66, 92, 88],
       [50,  1, 23,  6, 59],
       [67, 55, 46, 78,  3]])

In [129]: B
Out[129]: 
array([[78, 63, 45, 34, 81],
       [ 5, 38, 28, 61, 66],
       [ 3, 65, 16, 25, 32],
       [72,  1, 31, 75,  6]])

In [130]: B[A == A.max(axis=1)[:,None]]
Out[130]: array([45, 61, 32, 75])

print np.max(A[i])
这将在
i
矩阵的
numpy
第几行中给出最高值。

好答案(+1),那么尝试使用
np.argpartition
构建解决方案怎么样?这很聪明!这就是我开始喜欢Python的原因。你可以用简单的命令做复杂的事情!