2011-06-06 43 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)]