Można to osiągnąć poprzez tworzenie trzecią tablicę dtype uint8 plus tablica bool (które razem są bardziej wydajne pod względem pamięci, niż jedna tablica UINT16).
np.putmask
jest przydatne do uniknięcia tablicy temp.
a = np.array([100, 200, 250], dtype=np.uint8)
b = np.array([50, 50, 50], dtype=np.uint8)
c = 255 - b # a temp uint8 array here
np.putmask(a, c < a, c) # a temp bool array here
a += b
Jednakże, @moarningsun prawidłowo wskazuje tablicę BOOL wykonuje się tę samą ilość pamięci w postaci tablicy uint8, więc nie musi być pomocny. Jest możliwe, aby rozwiązać ten problem przez uniknięcie konieczności tablicy więcej niż jeden temp w danym momencie:
a = np.array([100, 200, 250], dtype=np.uint8)
b = np.array([50, 50, 50], dtype=np.uint8)
b = 255 - b # old b is gone shortly after new array is created
np.putmask(a, b < a, b) # a temp bool array here, then it's gone
a += 255 - b # a temp array here, then it's gone
Podejście transakcji zużycia pamięci do jednostki centralnej.
Innym podejściem jest precalculate wszystkie możliwe wyniki, czyli O (1) Pamięć dodatkowa (czyli niezależnie od wielkości swoich tablic):
c = np.clip(np.arange(256) + np.arange(256)[..., np.newaxis], 0, 255).astype(np.uint8)
c
=> array([[ 0, 1, 2, ..., 253, 254, 255],
[ 1, 2, 3, ..., 254, 255, 255],
[ 2, 3, 4, ..., 255, 255, 255],
...,
[253, 254, 255, ..., 255, 255, 255],
[254, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
c[a,b]
=> array([150, 250, 255], dtype=uint8)
Takie podejście jest najbardziej pamięć - jeśli twoje tablice są bardzo duże. Ponownie, jest to kosztowne w czasie przetwarzania, ponieważ zastępuje superszybkie liczby całkowite z wolniejszym indeksowaniem 2dim-array.
WYJAŚNIENIE jak to działa
budowa tablicy c
powyżej korzysta z numpy nadawczej sztuczki. Dodanie tablicy kształtu (N,)
i tablicy kształtu (1,N)
nadaje się zarówno jako (N,N)
-like, w ten sposób wynik jest tablicą NxN wszystkich możliwych sum. Następnie go przypinamy. Otrzymujemy tablicę 2dim spełniającą: c[i,j]=min(i+j,255)
dla każdego i, j.
To, co pozostało, to wymyślne indeksowanie, aby pobrać prawidłowe wartości.Praca z wejściem podałeś, mamy dostęp do:
c[([100, 200, 250] , [50, 50, 50])]
Pierwszy indeksu tablicy odnosi się do 1 słabe, a druga do 2 Dim. Zatem wynikiem jest tablica o tym samym kształcie, co tablice indeksów ((N,)
), składające się z wartości [ c[100,50] , c[200,50] , c[250,50] ]
.
Nie wiedziałem o "putmask", dzięki za to! Korzystając z tej funkcji, myślę, że również "a + = b", po której następuje 'np.putmask (a, a
@moarningsun Myślę, że masz rację. Jednak opiera się na przepełnieniu, z którym osobiście nie czuję się doskonale z ... – shx2
@moarningsun, dlaczego usunąłeś swoją odpowiedź? Myślę, że jest to przyzwoita odpowiedź i działa – shx2