39

阅读numpy中 argmin 函数的文档时,我有点困惑。看起来它应该完成这项工作:

读这个

返回沿轴的最小值的索引。

我可能会认为

np.argmin([5, 3, 2, 1, 1, 1, 6, 1])

将返回所有索引的数组:这将是[3, 4, 5, 7]

但不是这个,它只返回3. 问题在哪里,或者我应该怎么做才能得到我的结果?

4

4 回答 4

58

当您考虑多维数组时,该文档更有意义。

>>> x = numpy.array([[0, 1],
...                  [3, 2]])
>>> x.argmin(axis=0)
array([0, 0])
>>> x.argmin(axis=1)
array([0, 1])

指定轴后,argmin沿给定轴获取一维子数组,并返回每个子数组最小值的第一个索引。它不会返回单个最小值的所有索引。

要获取最小值的所有索引,您可以执行

numpy.where(x == x.min())
于 2013-09-02T23:57:06.760 回答
21

请参阅文档numpy.argmax(由文档引用numpy.argmin):

如果最大值多次出现,则返回与第一次出现对应的索引。

文档的措辞(“索引”而不是“索引”)是指提供时的多维情况axis

所以,你不能用np.argmin. 相反,这将起作用:

np.where(arr == arr.min())
于 2013-09-02T23:56:55.457 回答
2

假设您想要列表的索引,而不是 numpy 数组,请尝试

import numpy as np

my_list = [5, 3, 2, 1, 1, 1, 6, 1]
np.where(np.array(my_list) == min(my_list))[0]

索引 [0] 是因为 numpy 返回您的答案的元组,什么都没有(答案作为 numpy 数组)。不要问我为什么。

于 2018-11-18T18:46:35.503 回答
2

我想快速补充一下,正如用户 grofte 提到的,np.where它返回一个元组,它声明它是一个简写,nonzero它有一个相应的方法flatnonzero,可以直接返回一个数组。

所以,最干净的版本似乎是

my_list = np.array([5, 3, 2, 1, 1, 1, 6, 1])
np.flatnonzero(my_list == my_list.min())
=> array([3, 4, 5, 7])
于 2020-01-27T12:49:05.227 回答