2013-03-02 120 views
1

技術上是什麼numpy的陣列分配值

import numpy as np 
a = np.random.random((100,3)) 
b = numpy.empty((100)) 

# what the difference between 
b = a[:,0] 
# and 
b[:] = a[:,0] 

的原因,我問,我正在讀B,其中A FORTRAN編譯函數,在b切片正在所有的差異之間的差異。這與C和Fortran之間的列和行閱讀風格有關。在默認的numpy約定是C的。

回答

3

的主要區別在於,

b = a[:,0] 

創建視圖到a的數據,而

b[:] = a[:,0] 

使得數據的副本。

前者使用與a相同的內存佈局,而後者保留原始b的內存佈局。特別地,這意味着在後一種情況下,所有數據被壓縮成連續的內存位置:

In [29]: b = numpy.empty((100)) 

In [30]: b = a[:,0] 

In [31]: b.strides 
Out[31]: (24,) 



In [32]: b = numpy.empty((100)) 

In [33]: b[:] = a[:,0] 

In [34]: b.strides 
Out[34]: (8,) 
+2

作爲邊注到NPE的回答,在第一情況下,'numpy.empty((100))'陣列被丟棄,因爲'b'不再指向它。 – Jaime 2013-03-02 23:48:51