Numpy Argmin элегантное решение требуется. - PullRequest
3 голосов
/ 06 июня 2011

В Python, чтобы найти индекс минимального значения массива, который я использую y = numpy.argmin(someMat)

Могу ли я найти минимальное значение этой матрицы, чтобы она не лежала в заданном диапазоне аккуратно

Ответы [ 2 ]

7 голосов
/ 06 июня 2011

"Могу ли я найти минимальное значение этой матрицы, чтобы она не лежала в заданном диапазоне аккуратно?"

Если вас интересует только минимальное значение, удовлетворяющее некоторому условию, а не местоположение, тогда

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

4 голосов
/ 06 июня 2011

Полагаю, это то, чего вы пытаетесь достичь:

Argmin с массивами:

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

Аргмин с матрицами:

>>> 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...