我正在尝试执行以下操作,给定一个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,我想要以更加笨拙的方式执行此任务的任何提示。
答案 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.]