索引或numpy数组转换为整数元组?

3
我试图获取一个包含 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之外,任何其他建议都是完全可以接受的。谢谢。

“where” 结果出了什么问题?a[b] 不是会给你最小值吗?“where” 返回一个元组数组(等价于列表),因为0、1或更多个元素可能满足它的真实条件。 - hpaulj
问题在于,正如您所说,where返回一个数组元组。我的字典键是整数元组(0,2)。除非我漏掉了什么,否则my_dict[b]=my_dict[(array([0]),array([2]))和my_dict[c]=my_dict[[(0,), (2,)]]都不等同于my_dict[(0,2)]。 - Wes
作为字典键使用,我会这样写:{tuple([i[0] for i in b]): a[b]}i.item() 也可以。 - hpaulj
2个回答

6
你可以通过以下最简单的方式获得所需结果:
>>> np.unravel_index(a.argmin(), a.shape)
(0, 2)
argmin()方法在单次遍历中查找压平数组中最小元素的索引,因此比先查找最小值再使用线性搜索来查找最小值的索引更有效。
作为第二步,np.unravel_index()将标量索引转换回索引元组。请注意,索引元组的条目具有np.int64类型而不是普通的int类型。

2

如果您有多个具有相同 min 值的元素,您可能需要一个元组列表。对于这种情况,您可以在列堆叠行和列信息之后使用 np.where 获取的信息,然后使用 map -

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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接