Python 需要numpy argmin优雅的解决方案。

Python 需要numpy argmin优雅的解决方案。,python,numpy,scipy,Python,Numpy,Scipy,在python中,我使用y=numpy.argmin(someMat) 我能不能找到这个矩阵的最小值,使它不在指定的范围内?我猜这就是你想要实现的目标: 带数组的Argmin: >>> from numpy import * >>> a = array( [2,3,4] ) >>> argmin(a) 0 >>> print a[argmin(a)] 2 带矩阵的Argmin: >>> b=array(

在python中,我使用
y=numpy.argmin(someMat)


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

我猜这就是你想要实现的目标:

带数组的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
将ravel与argmin组合时,必须写入:

>>> print b
[[6 5 4]
 [3 2 1]]
>>> ravel(b)
array([6, 5, 4, 3, 2, 1])
>>> print ravel(b)[argmin(b)]
“我能否找到该矩阵的最小值,使其不在指定范围内?”

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

>>> 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
>numpy.random.seed(1)
>>>m=numpy.random.randn(5,5.)
>>>m
数组([[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
>numpy.ma.array(m,mask=((m0.8))).argmin()
23
>>>m.flat[23]
0.50249433890186823
注意,这里的条件是翻转的,因为掩码对于排除的值是真的,而不是包含的值


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

>xx,yy=numpy.index(m.shape)
>>>分数=((xx==0)和(yy==0))|((xx>2)和(yy<3))
>>>要点
数组([[True,False,False,False,False],
[假,假,假,假,假],
[假,假,假,假,假],
[真,真,真,假,假],
[True,True,True,False,False]],dtype=bool)
>>>m[点数]
阵列([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和y-y1]或已连接[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