2011-06-06 149 views

回答

7

“我能找到的这个矩阵的最小值是不是在一个精确的范围内?

如果你只关心对满足一定条件的最低值,而不是位置,然后

>>> 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您想要的输入和输出的例子。

+0

嗯,这不完全是我想要的,但它似乎很有趣,我想找到一个数组的最小值,使得这个最小值应该位于索引x到y之间。这个范围可能连接或断开,所以说[x-x1和y-y1]或连接[x-y]。 – JustInTime 2011-06-06 11:20:51

4

我猜这就是你想达到什么目的:

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

当你与argmin结合拉威尔,你必须写:

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