2015-09-10 2 views
2

У меня есть маскированный массив, из которого я хотел бы вернуть индекс из минимальное значение. Кроме того, я хотел бы вернуть индекс случайно выбранного минимума, если его несколько. В приведенном ниже примере, это должно случайным образом возвращать индекс 4 или 5:Получите минимальное значение маскированного массива

import numpy as np 
import numpy.ma as ma 
import random 

my_mask = [1, 0, 0, 1, 0, 0] 
my_array = [ 0.018, 0.011, 0.004, 0.003, 0.0, 0.0] 
masked_array = ma.masked_array(my_array,my_mask) 

min_indices = np.where(masked_array.min() == masked_array) 
min_index = np.random.choice(min_indices[0]) 

print masked_array 
print min_index  

Моя проблема: Элементы маскированные рассматриваются как ноль, и любой элемент из {0,3,4,5} может быть возвращен (?).

Мой вопрос: Каков хороший способ вернуть индекс (случайно выбранный) минимум из массива (исключая маскированные значения)?

+0

Насколько я могу сказать, 'masked_array.min' делает игнорировать маскированные значения. У вас на самом деле есть нули в действительной части вашего массива. – tzaman

ответ

2

Использование ma.where() вместо np.where()

min_indices = ma.where(masked_array == masked_array.min())) 
print(min_indices) 

Что дает:

(array([4, 5]),) 

Модуль ma имеет много функций, которые предназначены для работы с массивами в масках.

Наконец, захватывая случайный элемент из этого результата было бы что-то вроде:

min_index = np.random.choice(min_indices[0]) 
Смежные вопросы