2013-10-17 18 views
6

Artı eşit, dilimleme söz konusu olduğunda, açık toplama (hangisinin beklediği) atamadan farklı bir cevap veriyor. Bunun için bir sebep var mı? Artı artı mı önlenmeli?Numpy - dilimleme ile birlikte eşit davranan garip davranış

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

... – JBernardo

+0

Ah, ben şimdi görüyoruz - gittikçe eklentiyi değiştiriyorsunuz. Bu yüzden, cevabın kendinden referanslı davranışa sahip olmanızdan (artı statik olmak zorunda olduğunuzda) artı eşitlemektir. Teşekkürler - – brasqueychutter

cevap

3

JBernardo yorumladığı gibi, yerinde diziyi değiştirmek +=.

a[3:] += [a:-3] aşağıdaki benzer:

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

, dizinin kullanılması kopyasını Bunu önlemek için:

Eğer 1 durumda yerinde değişen çünkü
>>> 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

Güzel ve açık bir açıklama. Ve kopyalama sözdizimi hakkında yararlı bir hatırlatma ... – brasqueychutter

+1

Burada + izlemek için başka bir sorun, yerinde olduğu için normal atama yaptığı gibi dtype teşvik etmiyor olmasıdır. Yani a = np.arange (10) gibi bir şey; a * = np.pi' muhtemelen istediğiniz şeyi yapmayacaktır. – Evan

+0

Ah, bilmek çok yardımcı oldu. Büyük teşekkürler, Evan, bahşiş için. – brasqueychutter

İlgili konular