2013-03-02 119 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