【问题标题】:numpy argmin elegant solution required.需要 numpy argmin 优雅的解决方案。
【发布时间】:2011-06-06 08:40:58
【问题描述】:

在python中查找我用的数组最小值的索引y = numpy.argmin(someMat)

我能否找到这个矩阵的最小值,使其不在指定范围内以一种简洁的方式?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    “我能找到这个矩阵的最小值,使其不在指定范围内吗?”

    如果你只关心满足某个条件的最小值而不关心位置,那么

    >>> numpy.random.seed(1)
    >>> m = numpy.random.randn(5.,5.)
    >>> m
    array([[ 1.62434536, -0.61175641, -0.52817175, -1.07296862,  0.86540763],
           [-2.3015387 ,  1.74481176, -0.7612069 ,  0.3190391 , -0.24937038],
           [ 1.46210794, -2.06014071, -0.3224172 , -0.38405435,  1.13376944],
           [-1.09989127, -0.17242821, -0.87785842,  0.04221375,  0.58281521],
           [-1.10061918,  1.14472371,  0.90159072,  0.50249434,  0.90085595]])
    >>> m[~ ((m < 0.5) | (m > 0.8))].min()
    0.50249433890186823
    

    如果您确实想通过 argmin 获取位置,那么这有点棘手,但一种方法是使用掩码数组:

    >>> numpy.ma.array(m,mask=((m<0.5) | (m > 0.8))).argmin()
    23
    >>> m.flat[23]
    0.50249433890186823
    

    请注意,这里的条件是翻转的,因为掩码对于排除的值是 True,而不是包含的值。


    更新:“在指定范围内”似乎并不意味着最小值不在某些范围内,而是您希望根据 x,y 坐标从搜索中排除矩阵的某些部分.这是一种方式(与以前的矩阵相同):

    >>> xx, yy = numpy.indices(m.shape)
    >>> points = ((xx == 0) & (yy == 0)) | ((xx > 2) & (yy < 3))
    >>> points
    array([[ True, False, False, False, False],
           [False, False, False, False, False],
           [False, False, False, False, False],
           [ True,  True,  True, False, False],
           [ True,  True,  True, False, False]], dtype=bool)
    >>> m[points]
    array([ 1.62434536, -1.09989127, -0.17242821, -0.87785842, -1.10061918,
            1.14472371,  0.90159072])
    >>> m[points].min()
    -1.1006191772129212
    

    如果您需要这些位置,请使用相应的掩码数组变体。 [编辑为使用索引而不是 mgrid;直到今天在另一个答案中使用它之前,我实际上已经忘记了它!]

    如果我仍然错了 :^) 并且这也不是您所追求的,请编辑您的问题以包含您所需输入和输出的 3x3 示例。

    【讨论】:

    • 嗯,这不是我想要的,但看起来很有趣,我想找到一个数组的最小值,使得这个最小值应该位于索引 x 到 y 之间。这个范围可能是连接的或断开的,比如说 [x-x1 and y-y1] 或连接的 [x-y]。
    【解决方案2】:

    我猜这就是你想要达到的目标:

    带有数组的 Argmin:

    >>> from numpy import *
    >>> a = array( [2,3,4] )
    >>> argmin(a)
    0
    >>> print a[argmin(a)]
    2
    

    带有矩阵的 Argmin:

    >>> b=array( [[6,5,4],[3,2,1]] )
    >>> argmin(b)
    5
    >>> print b[argmin(b)]
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    IndexError: index out of bounds
    

    同样的索引方法不适用于数组。原因是 argmin(以及 argmax)返回变量的索引 - 如果是矩阵,您需要将 n 维矩阵转换为一维索引数组。

    为此,您需要致电ravel

    >>> print b
    [[6 5 4]
     [3 2 1]]
    >>> ravel(b)
    array([6, 5, 4, 3, 2, 1])
    

    ravel 与 argmin 结合时,必须写:

    >>> print ravel(b)[argmin(b)]
    

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多