Справка Python с использованием ‘numpy.masked_where’ условно из другого списка

#python #arrays #numpy #masked-array

#python #массивы #numpy #masked-array

Вопрос:

Я пишу моделирование астрономических наблюдений. У меня есть массив данных, который составляет 1 измерение за 24 часа:

 data = [0,1,2,3,4]
  

И у меня есть массив, который представляет собой минуты облачности / дождя за 24-часовой период, округленный до ближайшего часа:

 weather = [0,60,120,180,0]
  

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

Поэтому, если я хочу показывать только точки данных, в которых было <120 минут простоя, я делаю:

 downtime = 120

data_masked = np.ma.masked_where(weather < downtime, data)
  

Это должно привести к:

 data_masked = [0, 1, ---, ---, 4]
  

Но мой data_masked, похоже, делает обратное. Если я построю как свои данные, так и погоду на одной оси. Я маскирую точки, в которых время простоя при погоде ниже моего порога.

Я попытался инвертировать оператор, который, кажется, просто сохраняет все. Есть идеи или я упускаю смысл numpy.ma ?

Спасибо!

Ответ №1:

Использование numpy.ma возвращает маску. То есть он скрывает (маскирует) все, что соответствует условию weather < downtime . Если вы хотите показать все, что соответствует условию, просто инвертируйте условие:

 data = np.array([0,1,2,3,4])
weather = np.array([0,60,120,180,0])
downtime = 120
data_masked = np.ma.masked_where(weather >= downtime, data)
data_masked
  

Тогда вывод будет:

 masked_array(data = [0 1 -- -- 4], 
             mask = [False False  True  True False],
             fill_value = 999999)
  

Для доступа к данным используйте data_masked.data .

Ответ №2:

Вы захотите использовать

 np.ma.MaskedArray(data,mask)
  

Обратите внимание, что маска определяет данные, которые должны быть замаскированы. Кроме того, для следующего типа операции

 weather < downtime
  

чтобы работать так, как вы предполагаете, ‘weather’ должен быть массивом, а не списком, поэтому:

 weather = np.array([0,60,120,180,0])
...
data_masked=np.ma.MaskedArray(data, weather >= downtime)
  

Обратите внимание, что я использовал ‘>=’ вместо ‘<‘, чтобы получить требуемый результат