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 № 1Szukasz 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ć.