2d数组python的最小值

时间:2017-06-08 09:11:57

标签: python arrays numpy

我有一个以下结构的数组,这个结构简化了这个问题:

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是我正在寻找的解决方案,我不知道它存在,所以我的答案得到了解决。

3 个答案:

答案 0 :(得分:5)

  

然而,它仅沿单个轴进行求值并沿单个行/列返回最小值的索引,而我希望评估整个数组并返回最低值而不是索引。

默认情况下,

numpy.argmin不沿单个轴进行求值,默认是沿着展平矩阵求值,并返回展平数组中的线性索引;来自您链接的numpy文档:

  

默认情况下,索引进入展平数组,否则沿指定轴。

无论哪种方式,使用numpy.aminnumpy.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