Python numpy数组操作的奇怪行为

Python numpy数组操作的奇怪行为,python,arrays,numpy,Python,Arrays,Numpy,解释一下: >>> a = np.arange(10) >>> a[2:] array([2, 3, 4, 5, 6, 7, 8, 9]) >>> a[:-2] array([0, 1, 2, 3, 4, 5, 6, 7]) >>> a[2:] - a[:-2] array([2, 2, 2, 2, 2, 2, 2, 2]) >>> a[2:] -= a[:-2] >>> a array(

解释一下:

>>> a = np.arange(10)
>>> a[2:]
array([2, 3, 4, 5, 6, 7, 8, 9])
>>> a[:-2]
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> a[2:] - a[:-2]
array([2, 2, 2, 2, 2, 2, 2, 2])
>>> a[2:] -= a[:-2]
>>> a
array([0, 1, 2, 2, 2, 3, 4, 4, 4, 5])
当然,预期的结果是
数组([0,1,2,2,2,2,2,2,2])

我猜这与numpy并行化有关,但它不够聪明,无法确定它需要先创建数据的临时副本(或者按照正确的顺序执行操作)

换言之,我怀疑它在做这样幼稚的事情:

for i in range(2, len-2):
    a[i] -= a[i-2]
作为参考,它在Matlab和倍频程中工作:

a = 0:9
a(3:end) = a(3:end) - a(1:end-2)

a =

  0  1  2  3  4  5  6  7  8  9

a =

  0  1  2  2  2  2  2  2  2  2
事实上,如果你这样做,效果会很好:

a[2:] = a[2:] - a[:-2]

所以这大概意味着
a-=b
a=a-b
对于numpy是不同的


事实上,现在我开始考虑它,我认为Mathworks将此作为不实现+=、-=、/=和*=运算符的原因之一

当您像在本例中那样对numpy数组进行切片时,您将获得数据的视图,而不是副本

见:


意外行为是由于数组造成的,因为(正如@JoshAdel在回答中所述),切片返回的是一个视图,而不是数组的副本。您的“naive”循环示例已经解释了如何计算结果。但我要对你的解释补充两点:

首先,意外的行为不是由于numpy并行化操作造成的。如果操作是并行的,那么您不应该期望[一致地]看到原始循环的结果(因为该结果取决于循环的有序执行)。如果你重复你的实验几次,即使是对于大型阵列,你也会看到同样的结果

第二,虽然你的假设总体上是正确的,但我要这样说:


a
b
没有别名时,
a-=b
a=a-b
对于两个numpy数组是相同的。

“因此,这可能意味着
a-=b
a=a-b
对于numpy它们在纯python中也不相同!”