选择numpy列中的最大元素,并获取它的行

时间:2017-06-18 23:26:09

标签: python arrays python-3.x numpy

我正在尝试执行以下操作,给定一个numpy数组'A',我需要获取每列的最大元素(绝对值)并获取此元素的行(重复值无关紧要) 。

import numpy as np

A = np.array(
    [[1, 1, 1],
     [2, 1, 3],
     [3, 1, 6]], dtype=float)

到目前为止我的天真解决方案如下:

for i in range(len(A)):
    max_elm_col = A[0,i]
    max_elm_row = 0
    for index, el in enumerate(A[0:, i]):
        if abs(el) > max_elm_col:
            max_elm_col = el
            max_elm_row = index

    print(max_elm_col, max_elm_row)

哪个输出:

3.0 2
1.0 0
6.0 2 

虽然这确实解决了我的问题,但可能看起来更多(num)Pythonic。所以我试着像这样重做:

for i in range(len(A)):
    # cool way
    max_elm_col = max(A[0:,i], key = abs)
    print(max_elm_col)

哪个输出:

3.0
1.0
6.0

检查docs后,可以使用 np.amax 完成同样的操作,但不会让我使用 key = abs 。< / p>

for i in range(len(A)):
    max_elm_col = np.amax(A[0:,i], axis=0)
    print(max_elm_col)

由于我不熟悉numpy,我想要以更加笨拙的方式执行此任务的任何提示。

1 个答案:

答案 0 :(得分:3)

一种方法是计算堆叠数组中的abs值,如:

代码:

maxs = np.vstack([A, np.abs(A)]).argmax(axis=0) % A.shape[0]

测试代码:

import numpy as np

A = np.array(
    [[1,  1, 1],
     [2, -2, 3],
     [2,  1, 3],
     [3,  1, 6]], dtype=float)


maxs = np.vstack([A, np.abs(A)]).argmax(axis=0) % A.shape[0]
print(maxs)
print(A[maxs, np.arange(A.shape[1])])

结果:

[3 1 3]
[ 3. -2.  6.]