Python中2D数组的最小值

15

我有一个数组,结构如下。为了简化这个问题,这里只展示了部分内容:

8 2 3 4 5 6
3 6 6 7 2 6
3 8 5 1 2 9
6 4 2 7 8 3

我希望找到这个二维数组中的最小值,但使用内置的min函数会返回一个值错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我尝试了使用np.argmin来代替:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmin.html

但它只能沿着单个轴进行评估,并返回单行/列中最小值的索引,而我想评估整个数组并返回最低值,而不是索引。

如果可能的话,最好也可以返回最小项的索引值,因为可以从中轻松找到最小值。

编辑:感谢下面的评论,np.min是我要寻找的解决方案,我之前不知道它的存在,所以我的问题已经解决。


3
你是不是在使用numpy.min - Divakar
1
你能展示一些“可运行的代码”吗? - void
考虑你的数组,正确答案将是 1 吗? - akash karothiya
哦,我不知道np.min有自己的变体,这完美地解决了它,谢谢。 - cd123
3个回答

24

然而,numpy.argmin 只在一个轴上进行评估,并返回沿单行/列的最小值的索引,而我希望评估整个数组并返回最小值而不是索引。

numpy.argmin 默认不仅会沿着一个轴进行评估,而是在展平的矩阵上进行评估,并返回展平数组中的线性索引。正如您所链接的 numpy 文档中所述:

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

无论哪种方式,使用numpy.aminnumpy.min来返回最小值,或对于数组arrname,使用arrname.min()来实现同样的效果。正如您提到的,numpy.argmin 返回最小值的索引(当然,您可以使用该索引通过对其进行索引来返回最小值)。 您还可以将其展开为单维数组,再传递给内置的 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

你知道什么是最快的方法吗? - Joe
1
@Joe np.amin(arr), np.min(arr)arr.min() 应该是等效的,并且可能比内置的 min() 更快。 - alkasm

17

非NumPy解决方案:

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

1
它确实可以工作,但并没有回答问题。原帖并没有要求非numpy解决方案,因此提供一个性能较差的解决方案是没有意义的。 - Imanol Luengo
13
实际上,标题和问题是否必须使用numpy存在歧义,唯一的numpy参考是链接和标签。因此,本回答对于不使用numpy的用户也将很有帮助。标记为numpy并不意味着只能提供numpy答案。我不指望这个回答会被提问者接受,但我期望这个回答可以帮助未来的其他用户,因为这就是这个网站的目的。 - Nick stands with Ukraine
公平地说,标题可能是唯一有歧义的东西。问题中的所有其他内容,从标签、错误、文档链接到np.argmin都指向numpy。是的,我同意这个网站是为了帮助他人,但每件事都有其适合的场所。我可以在这里写一个numpy教程,这将使每个读者受益,但这不是它的适当位置。 - Imanol Luengo

1
您可以使用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

2
  1. numpy已经有了np.min,比Python的min快几个数量级。
  2. 如果使用numpy,则根本不需要reshape。
- Imanol Luengo

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