2016-01-22 52 views
4

目前我正在从一个文本文件中提取测量数据的python脚本。我正在使用iPython笔记本和Python 2.7Python:当一个数组移位时,numpy数组是否被链接?

现在我遇到了一些奇怪的行为时使用numpy数组。我对此没有任何解释。

myArray = numpy.zeros((4,3)) 
myArrayTransposed = myArray.transpose() 

for i in range(0,4): 
    for j in range(0,3): 
     myArray[i][j] = i+j 

print myArray 
print myArrayTransposed 

导致:

[[ 0. 1. 2.] 
[ 1. 2. 3.] 
[ 2. 3. 4.] 
[ 3. 4. 5.]] 
[[ 0. 1. 2. 3.] 
[ 1. 2. 3. 4.] 
[ 2. 3. 4. 5.]] 

因此,没有转置阵列上的工作,值这个数组中更新。

这怎么可能?

+1

转不创建一个副本。它只是改变了读取相同数据的顺序。如果numpy文档没有提到这个,会很奇怪 – M4rtini

+1

他们确实提到它[这里](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.ndarray.transpose.html) 。如果你想要一个真正的副本,返回值是对原始数组“ – Wombatz

+1

'myArray.T.copy()”的“视图”。 '.T'是'.transpose()的简写'' – M4rtini

回答

4

http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

不同ndarrays可以共享相同的数据,因此,在一个ndarray所做的更改可能在另一个可见。也就是说,ndarray可以是另一个ndarray的“视图”,它所指的数据由“base”ndarray处理。 ndarrays也可以是由Python字符串或实现缓冲区或数组接口的对象拥有的内存视图。

当你做一个转置(),这会返回一个“视图”到原始的ndarray。它指向相同的存储缓冲器,但是它具有不同的索引方案:

的存储器段是固有的1维的,并且有许多不同的方案用于布置在一个N维阵列的项1维块。 Numpy是灵活的,并且ndarray对象可以适应任何标准索引方案。

要创建一个独立的ndarray,你可以使用numpy.array()操作:

myArrayTransposed = myArray.transpose().copy() 
+0

你好,感谢所有回答我的问题的人。你给了我有价值的提示。祝你今天愉快! – engineController

+2

也许'numpy.copy'函数会更加明确地实现OP所要的:'myArrayTransposed = myArray.transpose()。copy()' –

+0

是的。我同意。修复 :-) –