#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)
Обратите внимание, что я использовал ‘>=’ вместо ‘<‘, чтобы получить требуемый результат