python - 如何使用 argmin 的输出作为 Numpy 的索引

标签 python numpy array-broadcasting

<分区>

我想在 rank-3 numpy 数组中找到沿给定轴的最小值的位置。我已经使用 np.argmin 获得了这些位置,但是我不确定如何将其“应用”到原始矩阵以获得实际的最小值。

例如:

import numpy as np

a = np.random.randn(10, 5, 2)
min_loc = a.argmin(axis = 0)   # this gives an array of shape (5, 2)

现在,问题是如何使用 min_loc 获得实际的最小值?我试过 a[min_loc],它给了我一个形状 (5, 2, 5, 2)。这个形状的逻辑是什么?我如何使用这个辅助矩阵来获得形状 (5, 2)

的合理解

请注意,a.min(axis = 0) 不是我正在寻找的解决方案。我需要一个通过 argmin 的解决方案。

最佳答案

a[min_loc]integer array indexing在第一个维度上,即它将为 min_loc 中的每个索引选择 (5, 2) 形状的数组。由于 min_loc 本身是 (5, 2) 形状的,对于 min_loc 中的每个整数,它会选择另一个 (5, 2 ) 形数组。您最终得到一个 (5, 2, 5, 2) 数组。同样的原因 a[np.array([0, 3])] 具有 (2, 5, 2)a[np.array( [[0], [3]])] 的形状为 (2, 1, 5, 2),因为您只提供第一个维度的索引。

对于您的用例,您不想为 min_loc 中的每个索引选择一个子数组,而是需要一个元素。例如,如果您有 min_loc = [[5, ...], ...],则第一个元素的完整索引应为 5, 0, 0而不是 5, :, :。这正是advanced indexing做。基本上通过提供一个整数数组作为每个维度的索引,您可以选择与特定位置对应的元素。您可以使用 np.indices(5, 2) 形状构造第二和第三维度的索引:

j, k = np.indices(min_loc.shape)
a[min_loc, j, k]

# [[-1.82762089 -0.80927253]
#  [-1.06147046 -1.70961507]
#  [-0.59913623 -1.10963768]
#  [-2.57382762 -0.77081778]
#  [-1.6918745  -1.99800825]]

其中 j, k 是 2 维和 3 维的坐标:

j
#[[0 0]
# [1 1]
# [2 2]
# [3 3]
# [4 4]]

k  
#[[0 1]
# [0 1]
# [0 1]
# [0 1]
# [0 1]]

或者如@hpaulj 所言,使用np.take_along_axis 方法:

np.take_along_axis(a, min_loc[None], axis=0)

# [[[-0.93515242 -2.29665325]
#   [-1.30864779 -1.483428  ]
#   [-1.24262879 -0.71030707]
#   [-1.40322789 -1.35580273]
#   [-2.10997209 -2.81922197]]]

关于python - 如何使用 argmin 的输出作为 Numpy 的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66402679/

相关文章:

python - 将 AWS Glue Python 与 NumPy 和 Pandas Python 程序包结合使用

python - Pandas - 为分组数据中的每个组分配唯一 ID

Python Numpy : Extracting a row from an array

python - 在 Numpy 中是否有更快的方法来做到这一点?

python - 如何验证 python 中的类属性?

python - 如何使用 PySide 将 .ui 文件加载到 python 类中?

python - R 的矩阵函数的 numpy 等价物是什么?

python - 在 numpy 中高效创建数组

python - 如何仅用另一个数组的值替换 numpy 数组的部分值?

python 抓取ajax内容