2016-01-22 50 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

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