/ / Python pomaga warunkowo używając "numpy.masked_where" z innej listy - python, tablice, numpy, masked-array

Pomoc Pythona przy użyciu warunku "numpy.masked_where" warunkowo z innej listy - python, tablice, numpy, masked-array

Piszę symulację obserwacji astronomii. Mam tablicę danych, która wynosi 1 pomiar na 24 godziny:

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

I mam tablicę, która jest minutą chmury / deszczu w ciągu 24 godzin, zaokrągloną do najbliższej godziny:

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

Chcę użyć ukrytej tablicy, aby ukryć wartościw tablicy danych na podstawie wartości z tablicy pogody. Maskowanie jest ważne (zamiast usuwania) do kreślenia i analizy danych w dalszej linii.

Więc jeśli chcę wyświetlać tylko punkty danych, w których wystąpił <120 minut przestoju:

downtime = 120

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

Powinno to spowodować:

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

Ale moja data_masked wydaje się robić coś przeciwnego. Jeśli wykreślę zarówno moje dane, jak i pogodę na tej samej osi. Zamaskowuję punkty, w których występuje przestój pogody poniżej mój próg.

Próbowałem już odwrócić operatora, który po prostu wydaje się trzymać wszystko. Jakieś pomysły czy brakuje mi punktu numpy.ma?

Dzięki!

Odpowiedzi:

1 dla odpowiedzi № 1

Będziesz chciał użyć

np.ma.MaskedArray(data,mask)

Zwróć uwagę, że maska ​​określa dane, które mają być zamaskowane. Także dla następującego rodzaju operacji

weather < downtime

do pracy zgodnie z intencją, "pogoda" musi być tablicą, a nie listą, więc:

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

Zwróć uwagę, że użyłem "> =" zamiast "<", aby uzyskać wymagany wynik


2 dla odpowiedzi nr 2

Za pomocą numpy.ma zwraca maskę. To jest to ukrywa (maskuje) wszystko, co pasuje do stanu weather < downtime. Jeśli chcesz pokazać wszystko, co pasuje do stanu, po prostu odwróć stan:

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

Następnie wynik będzie:

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

Aby uzyskać dostęp do danych, użyj data_masked.data.