2013-10-17 8 views
6

Più uguale è dare una risposta diversa rispetto all'assegnazione alla somma esplicita (che è la risposta che ci si aspetta), quando è coinvolto il taglio. C'è una ragione per questo? Dovrebbe essere evitato il maggior numero di uguali?Numpy - comportamento strano con plus uguale con slicing

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

perché stai cambiando in atto nel primo caso ... – JBernardo

+0

Ah, completamente a vederlo ora - modificando l'addend come si va. Quindi immagino che la risposta sia evitare più uguali quando si ha un comportamento autoreferenziale (che è inteso essere statico). Grazie - – brasqueychutter

risposta

3

Come commentato JBernardo, += modificare l'array in posizione.

a[3:] += [a:-3] è simile a seguente:

>>> 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 

Per evitare che, l'uso copia dell'array:

>>> 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

Bella ed esplicita spiegazione. E utile promemoria sulla sintassi della copia ... – brasqueychutter

+1

Un altro problema con + = a cui fare attenzione qui è che, poiché è sul posto, non promuove il dtype come fa il normale compito. Quindi qualcosa come 'a = np.arange (10); a * = np.pi' non farà quello che vorresti. – Evan

+0

Ah, molto utile sapere. Grazie mille, Evan, per la mancia. – brasqueychutter

Problemi correlati