以下示例对我来说很奇怪。数组a
和c
不同,但在修改a
的第一个元素时,c
的第一个元素也会发生变化。为什么numpy
数组是这样实现的?如果将a
指定为列表,则更改a
的第一个元素不会更改c
的第一个元素。我想不出任何需要numpy
数组行为的例子。
import numpy as np
a = np.arange(3,5)
#a = [3, 4]
b = a
c = a[:]
d = a.copy()
print(a is b) # True
print(a is c) # False
print(a is d) # False
print(a, b, c, d) #[3 4] [3 4] [3 4] [3 4]
a[0] = -11.
print(a, b, c, d) #[-11 4] [-11 4] [-11 4] [3 4] HUH?!
答案 0 :(得分:3)
Simple Numpy切片返回视图,而不是副本。顾名思义,视图由相同的数据支持,只是表示不同。这是使Numpy如此之快的部分原因,因为每次切片时都不必创建数据副本。
请参阅the docs。
我想不出c=a[:]
有用的原因,但c=a[::2]
可能有用。假设我得到其他每个元素的平均值,然后按平均值增加它们。
a=np.random.random(10)
b=a[::2]
b+=b.mean()
print a
没有理由特殊情况下您的示例返回副本而不是视图。事实上,熟悉Numpy切片如何工作的人会非常反直觉。