我正在尝试获取一个包含numpy数组中最小值的指示的元组。
import numpy as np
a=np.array(([2,3,1],[5,4,6],[8,7,9]))
b=np.where(a==np.min(a))
print(b)
给出:
(array([0]),array([2]))
尝试将结果映射到元组:
c=map(tuple,b)
print(c)
给出:
[(0,), (2,)]
但我想要的是:
(0,2)
除了np.where之外的任何建议都是完全可以接受的。感谢。
答案 0 :(得分:5)
获得所需结果的最简单方法是
>>> np.unravel_index(a.argmin(), a.shape)
(0, 2)
argmin()
方法在单次传递中查找展平数组中最小元素的索引,因此比首先找到最小值然后使用线性搜索查找最小值索引更有效。
第二步,np.unravel_index()
将标量索引转换为扁平数组,返回索引元组。请注意,索引元组的条目具有类型np.int64
而不是普通int
。
答案 1 :(得分:2)
对于具有相同min
值的多个元素的情况,您可能希望拥有元组列表。对于这种情况,您可以在对map
获取的行和列信息进行列堆叠后使用np.where
,就像这样 -
map(tuple,np.column_stack(np.where(a==np.min(a))))
示例运行 -
In [67]: a
Out[67]:
array([[2, 2, 0, 1, 0],
[0, 2, 0, 0, 3],
[1, 0, 1, 2, 1],
[0, 3, 3, 3, 3]])
In [68]: map(tuple,np.column_stack(np.where(a==np.min(a))))
Out[68]: [(0, 2), (0, 4), (1, 0), (1, 2), (1, 3), (2, 1), (3, 0)]