Podstawowe pytanie brzmi: Co dzieje się pod maską: a[i] += b
?Jak działają operacje numpy na miejscu (np. `+ =`)?
Biorąc pod uwagę następujące elementy:
import numpy as np
a = np.arange(4)
i = a > 0
i
= array([False, True, True, True], dtype=bool)
Rozumiem, że:
a[i] = x
jest taka sama jaka.__setitem__(i, x)
, której przypisuje się bezpośrednio do elementów wskazanych przezi
a += x
jest taka sama jaka.__iadd__(x)
, który uzupełnia dodatek
Ale co się dzieje, gdy robię:
a[i] += x
Konkretnie:
- Jest to taka sama jak
a[i] = a[i] + x
? (Co nie jest praca na miejscu) - Czy to robi różnicę w tym przypadku, jeśli
i
jest:- indeks
int
lub ndarray
lubslice
obiekt
- indeks
Tło
Powodem zacząłem zagłębiając się to, że natknąłem się nieintuicyjne zachowanie podczas pracy z duplikatów indeksów:
a = np.zeros(4)
x = np.arange(4)
indices = np.zeros(4,dtype=np.int) # duplicate indices
a[indices] += x
a
= array([ 3., 0., 0., 0.])
bardziej interesujących rzeczy o zduplikowanych indeksów w this question.
Nie widzę problemu z przykładem tła. Oczywiście musi wewnętrznie iterować we wszystkich wartościach. Jeśli przypiszesz wartości do tablicy jako operację w miejscu, w której wszystkie indeksy są takie same, ostatnia z nich będzie odrywać resztę. To wyraźnie się dzieje (ostatnia wartość 'x' powoduje, że cała reszta jest pusta). –
Och, widzę problem. Jeśli wewnętrznie wracasz do pamięci wyniku operacji, możesz się spodziewać sumy wszystkich wartości w 'x'. hmmm ... –
@HenryGomersall, dokładnie. – shx2