2013-10-17 7 views
6

Plus równa daje inną odpowiedź niż przypisanie do konkretnej sumy (która jest odpowiedzią, której się spodziewasz), gdy chodzi o cięcie. Czy istnieje ku temu powód? Czy powinno się unikać plus równego?Numpy - dziwne zachowanie z plusem równym z krojem

a = np.arange(10) 
b = np.arange(10) 
a[3:] += a[:-3] 
b[3:] = b[3:] + b[:-3] 
print a 
#[ 0 1 2 3 5 7 9 12 15 18] 
print b 
#[ 0 1 2 3 5 7 9 11 13 15] 
+4

bo jesteś zmienia się w miejscu w 1 przypadku ... – JBernardo

+0

Ach, całkowicie to teraz zobacz - modyfikuj dodatek podczas podróży. Więc myślę, że odpowiedź jest taka, aby uniknąć plusa równego, gdy zachowujesz się samo-referencyjnie (to znaczy być statycznym). Dzięki - – brasqueychutter

Odpowiedz

3

Dalej należy zauważyć JBernardo, += zmienić układ na miejscu.

a[3:] += [a:-3] jest podobny do następującego:

>>> import numpy as np 
>>> a = np.arange(10) 
>>> 
>>> for i in range(3, 10): 
...  print('a[{}] ({}) += a[{}] ({})'.format(i, a[i], i-3, a[i-3])) 
...  a[i] += a[i-3] 
...  print(' a[{}] -> {}'.format(i, a[i])) 
... 
a[3] (3) += a[0] (0) 
    a[3] -> 3 
a[4] (4) += a[1] (1) 
    a[4] -> 5 
a[5] (5) += a[2] (2) 
    a[5] -> 7 
a[6] (6) += a[3] (3) 
    a[6] -> 9 
a[7] (7) += a[4] (5) # NOTE: not (4) 
    a[7] -> 12 
a[8] (8) += a[5] (7) 
    a[8] -> 15 
a[9] (9) += a[6] (9) 
    a[9] -> 18 

Aby tego uniknąć, użyj kopię tablicy:

>>> a = np.arange(10) 
>>> a[3:] += np.copy(a[:-3]) # OR np.array(a[:-3]) 
>>> a 
array([ 0, 1, 2, 3, 5, 7, 9, 11, 13, 15]) 
+0

Dobre i wyraźne wyjaśnienie. Pomocne przypomnienie na temat składni kopiowania ... – brasqueychutter

+1

Innym problemem z + = należy uważać, ponieważ jest on w miejscu, nie promuje on dtype tak, jak robi to normalne zadanie. Tak więc coś jak 'a = np.arange (10); a * = np.pi' nie zrobi tego, czego prawdopodobnie chcesz. – Evan

+0

Ach, bardzo pomocne. Wielkie dzięki, Evan, za napiwek. – brasqueychutter