如何正确使用 argmin 的结果来切出最小值数组?

how do I properly use the result of argmin to slice out an array of the minimums?

我想沿着数组的第一个轴切出最小值。 例如,在下面的代码中,我想打印出 np.array([13, 0, 12, 3])。 但是,切片的行为并不像我想象的那样。
(我稍后确实需要 argmin 数组,不想只使用 np.min(g, axis=1)

import numpy as np
g = np.array([[13, 23, 14], [12, 23, 0], [39, 12, 92], [19, 4, 3]])
min_ = np.argmin(g, axis=1)
print(g[:, min_])

这里发生了什么? 为什么我的代码结果是

[[13 14 23 14]
 [12  0 23  0]
 [39 92 12 92]
 [19  3  4  3]]

其他详情:
Python3.10.2
麻木 1.22.1

您的代码按顺序打印 g 数组的第一、第三、第二和第三列。

>>> np.argmin(g, axis=1)
array([0, 2, 1, 2])  # first, third, second, third

如果要获取每一行的最小值,使用np.min:

>>> np.min(g, axis=1)
array([13,  0, 12,  3])

当您写 g[:, min_] 时,您是在说:“给我 所有行 (shorthand :) 索引处的列 min_(即0, 2, 1, 2)”。

你想说的是:“给我 这些行和这些列 的值” - 换句话说,你缺少相应的 行索引 以匹配 min_.

中的列索引

由于您所需的行索引只是从 0g.shape[0] - 1 的数字范围,从技术上讲,您可以将其写为:

print(g[range(g.shape[0]), min_])
# output: [13  0 12  3]

但如果您的目标是提取 row-wise 最小值,@richardec 的解决方案总体上更好。

如果你想使用np.argmin,你可以试试这个:

更多解释: 来自 min_ 你有 array([0, 2, 1, 2]) 但是为了访问数组你需要 ((0, 1, 2, 3), (0, 2, 1, 2)) 因为这个原因你可以使用range.

min_ = np.argmin(g, axis=1)
g[range(len(min_)), min_] # like as np.min(g ,axis=1)

输出:

array([13,  0, 12,  3])