开发者

numpy argmin elegant solution required.

开发者 https://www.devze.com 2023-03-10 10:22 出处:网络
In python to find the index of the minimum value of the array I usey = numpy.argmin(someMat) Can i find the minimum value of this matrix such that it does not lie within a specified range in a开发者_

In python to find the index of the minimum value of the array I usey = numpy.argmin(someMat)

Can i find the minimum value of this matrix such that it does not lie within a specified range in a开发者_如何学运维 neat way?


"Can i find the minimum value of this matrix such that it does not lie within a specified range in a neat way?"

If you only care about the minimum value satisfying some condition and not the location, then

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

If you do want the location via argmin, then that's a bit trickier, but one way is to use masked arrays:

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

Note that the condition here is flipped, as the mask is True for the excluded values, not the included ones.


Update: it appears that by "within a specified range" you don't mean the minimum value isn't within some bounds, but that you want to exclude portions of the matrix from the search based on the x,y coordinates. Here's one way (same matrix as before):

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

with the corresponding masked array variant if you need the locations. [Edited to use indices instead of mgrid; I'd actually forgotten about it until it was used in another answer today!]

If I'm still wrong :^) and this also isn't what you're after, please edit your question to include a 3x3 example of your desired input and output.


I'm guessing this is what you are trying to achieve:

Argmin with arrays:

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

Argmin with matrices:

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

Same approach for indexing doesn't work for arrays. The reason is that argmin (as well as argmax) returns index of the variable -- in case of a matrix, you need to convert your n-dimensional matrix to a 1-dimensional array of indices.

In order to do this, you need to call ravel :

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

When you combine ravel with argmin, you must write:

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

精彩评论

暂无评论...
验证码 换一张
取 消