Python numpy阵列的奇怪拷贝构造

Python numpy阵列的奇怪拷贝构造,python,arrays,numpy,Python,Arrays,Numpy,下面的例子对我来说很奇怪。数组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

下面的例子对我来说很奇怪。数组
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?!

简单的Numpy切片返回一个视图,而不是一个副本。顾名思义,视图由相同的数据支持,只是表示方式不同而已。这是Numpy如此之快的部分原因,因为它不必在每次切片时创建数据的副本

我想不出为什么
c=a[:]
会有用,但是
c=a[::2]
可能有用。假设我得到其他元素的平均值,然后将它们增加平均值

a=np.random.random(10)
b=a[::2]
b+=b.mean()
print a

没有理由将示例作为特例返回副本而不是视图。事实上,对于熟悉Numpy切片工作原理的人来说,这是非常违反直觉的。

你能想出一个例子,说明需要
c=a[:]
类型的赋值吗?@Chiel One可能是你想把所有元素都改成某个东西:
a[:]=某个东西
。换成这种形式,在你有了
c=a[:]
@Divakar之后,它将是
c=something
,这是一个相反的例子。@Chiel不。分配给数组的一个完整片段似乎毫无意义。但是对于一般的返回视图,是的,我添加了一个简单的示例。@Chiel:
row=data[0,:];如果某物:行[:]=1;其他:行[0]=10
。允许您跨多行拆分索引和分配
a[:]
对于列表和数组是不同的;
\uuu getitem\uu
索引方法不同。