Нахождение минимального значения выше 0 в 2D-массиве. Python - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь найти минимальное значение в 2D-массиве больше 0. Я просмотрел решения, данные для 1D-случая, и попытался применить это к этой конкретной ситуации, но ничего не получил.

count1
Out[36]: 
array([[2787, 2748, 2752, ..., 2820, 2832, 2903],
       [2794, 2729, 2748, ..., 2810, 2811, 2872],
       [2785, 2796, 2773, ..., 2852, 2877, 2854],
       ...,
       [2833, 2713, 2692, ..., 2703, 2883, 2974],
       [2759, 2726, 2688, ..., 2779, 2863, 2893],
       [2802, 2755, 2637, ..., 2777, 2841, 2946]], dtype=uint16)

k =0

a = np.min(filter(lambda x: x>k,count1))

a
Out[39]: <filter at 0x1a56f9dbc88>

По неизвестной мне причине вместо получения фактических значений я получаю сообщение фильтра. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 13 июля 2020

filter возвращает итерацию. Вам нужно перебирать итерации, чтобы получить значения. Это будет работать:

filtered = [f for f in filter(lambda x: x > 0, count1)]
a = np.min(filtered)

Или лучше было бы использовать логическое индексирование в numpy. Например,

filter = count1 > 0
filtered = count1[filter]
a = np.min(filtered)

Или вы можете объединить их в один оператор

a = np.min(count1[count1 > 0])
1 голос
/ 13 июля 2020

В вашем коде есть пара проблем.

Во-первых, вам нужно сгладить 2D-матрицу перед отправкой в ​​лямбда-функцию, если вы просто ищете минимальный элемент. В противном случае он пытается оценить всю строку.

Во-вторых, вы получаете сообщение о фильтре потому, что вы еще не оценили фильтр. Используйте list для оценки filter.

count1 = np.random.randint(0,2000,size=(20,20))
k = 0

a = list(filter(lambda x: x>k,count1.flatten()))
print(np.min(a))

Как видно из другого ответа, я бы подошел к этой проблеме с помощью numpy логических операций следующим образом:

np.min(count1[count1>k])
1 голос
/ 13 июля 2020

Поскольку у вас есть массив numpy, гораздо более простой способ отфильтровать и получить минимум - это сделать следующее.

np.min(count1[count1>k])

И причина, по которой вы видите объект фильтра, заключается в том, что filter возвращает объект фильтра. Кроме того, я не очень уверен, работает ли filter с 2D-массивами. Возможно, вам придется сначала его сгладить, если вы хотите использовать filter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...