我有一个以下结构的数组,这个结构简化了这个问题:
8 2 3 4 5 6
3 6 6 7 2 6
3 8 5 1 2 9
6 4 2 7 8 3
我希望在这个2D数组中找到最小值但是使用内置的min函数会返回一个值错误:
ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()
我已经研究过使用np.argmin的替代方法:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmin.html
然而,它仅沿单个轴进行求值并沿单个行/列返回最小值的索引,而我希望评估整个数组并返回最低值而不是索引。
如果可以返回数组中最低项的索引值,那么也可以更容易找到最低值。
编辑:感谢下面的评论np.min
是我正在寻找的解决方案,我不知道它存在,所以我的答案得到了解决。
答案 0 :(得分:5)
默认情况下,然而,它仅沿单个轴进行求值并沿单个行/列返回最小值的索引,而我希望评估整个数组并返回最低值而不是索引。
numpy.argmin
不沿单个轴进行求值,默认是沿着展平矩阵求值,并返回展平数组中的线性索引;来自您链接的numpy
文档:
默认情况下,索引进入展平数组,否则沿指定轴。
无论哪种方式,使用numpy.amin
或numpy.min
返回最小值,或等效地使用数组arrname
使用arrname.min()
。正如您所提到的,numpy.argmin
返回最小值的索引(当然,您可以使用此索引通过索引数组来返回最小值)。您还可以使用arrname.flatten()
展平为单维数组,并将其传递到内置min
函数中。
以下四种方法可以产生您想要的效果。
import numpy as np
values = np.array([
[8,2,3,4,5,6],
[3,6,6,7,2,6],
[3,8,5,1,2,9],
[6,4,2,7,8,3]])
values.min() # = 1
np.min(values) # = 1
np.amin(values) # = 1
min(values.flatten()) # = 1
答案 1 :(得分:5)
另一种非笨拙的解决方案:
>>> a = [[8,2,3,4,5,6],
... [3,6,6,7,2,6],
... [3,8,5,1,2,9],
... [6,4,2,7,8,3]]
>>> mymin = min([min(r) for r in a])
>>> mymin
1
答案 2 :(得分:0)
您可以使用np.min()
>>> arr = np.array([[8,2,3,4,5,6],
[3,6,6,7,2,6],
[3,8,5,1,2,9],
[6,4,2,7,8,3]])
>>> arr.min()
1