Python Numpy-奇怪的行为,加上与切片相等

Python Numpy-奇怪的行为,加上与切片相等,python,numpy,Python,Numpy,当涉及切片时,Plus equal给出的答案与分配给显式和(这是一个期望的答案)的答案不同。这有什么原因吗?应该避免加等于吗 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] 正如JBernardo所评论的那样,+=在适当的位置更改

当涉及切片时,Plus equal给出的答案与分配给显式和(这是一个期望的答案)的答案不同。这有什么原因吗?应该避免加等于吗

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]

正如JBernardo所评论的那样,
+=
在适当的位置更改数组

a[3::+=[a:-3]
类似于以下内容:

>>> 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
要避免这种情况,请使用阵列的副本:

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

因为你在第一种情况下改变了位置……啊,我现在完全明白了——一边修改加数。所以我想答案是,当你有自我参照行为(这意味着是静态的)时,避免加上相等。谢谢,+=还有一个问题需要注意,因为它已经就位了,所以不能像普通赋值那样提升数据类型。所以类似于
a=np.arange(10);a*=np.pi
不会做您可能想做的事情。