/ / Jak wymieszać dwie numpy tablic używając maski boolowskiej, aby efektywnie stworzyć ten sam rozmiar? - python, tablice, wydajność, numpy, maska

Jak połączyć dwa numpy tablice za pomocą maski boolean, aby efektywnie stworzyć taki sam rozmiar? - python, tablice, wydajność, numpy, maska

Używam dwóch tablic o tym samym rozmiarze, takich jak:

>>> a = [range(10)]
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = -a
>>> b
array([ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9])

Chcę utworzyć inną tablicę używając boolowskiej "maski", na przykład:

>>> m = (a % 2 == 0)
>>> m
array([ True, False,  True, False,  True, False,  True, False,  True, False], dtype=bool)

Następnie tworzę trzecią tablicę o tym samym rozmiarze i zmieniam jej wartości dla wartości at jeśli if jest True, a dla b jeśli m jest Fałszem:

>>> c = ones(10)
>>> c[m] = a[m]
>>> c[~m] = b[~m]
>>> c
array([ 0., -1.,  2., -3.,  4., -5.,  6., -7.,  8., -9.])

Zastanawiam się, czy istnieje sposób na wykonanie trzech ostatnich operacji (utworzenie c) w ramach tylko jednej operacji (szczególnie w celu optymalizacji wydajności).

Problem z wykonaniem:

c = a * m + b * m

to jest kiedy NaN w a lub b, gdy jest pomnożone przez zero, nadal tworzy NaN.

PS: Podany przeze mnie przykład również działałby na tablice o wymiarach n-wymiarowych.

Odpowiedzi:

8 dla odpowiedzi № 1

Szukasz numpy.where:

c = numpy.where(m, a, b)

Powodzenia.


0 dla odpowiedzi nr 2

Korzystając ze zrozumienia list, można utworzyć pewne warunki warunkowe, które decydują o wyborze listy?

result = [ a[i] if bol else b[i] for i, bol in enumerate(mask)]

A następnie możesz zastosować pewne funkcje do [i] lub b [i] w zależności od tego, jak chcesz je zmienić.