2013-06-28 115 views
4

从我读过的关于Numpy数组的内容来看,它们更符合标准Python列表的内存效率。令我困惑的是,当你创建一个numpy数组时,你必须传入一个python列表。我假设这个python列表被解构,但对我来说,如果你不得不创建一个效率更高的结构来创建高效的结构,它似乎会破坏具有高效内存数据结构的目的。numpy数组内存分配

numpy.zeros会解决这个问题吗?

回答

6

还有many ways to create a NumPy array。传递一个Python列表到np.arraynp.asarray就是这样一种方式。

另一种方法是使用一个迭代器:

In [11]: np.fromiter(xrange(10), count=10, dtype='float') 
Out[11]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

在这种情况下,不涉及大的临时Python列表。因此,您可以定义一个产生列表中项目的generator function而不是构建Python列表。然后创建数组,您可以将发生器传递给np.fromiter。由于np.fromiter始终创建一维数组,因此要创建更高维的数组,请在返回的值上使用reshape

还有np.fromfunctionnp.frombuffernp.fromfilenp.loadtxtnp.genfromtxtnp.fromstringnp.zerosnp.emptynp.ones。这些都提供了创建NumPy数组而不创建大型临时Python对象的方法。

1

如果您预先分配大小,Numpy通常更高效。如果你知道你将要填充一个MxN矩阵......先创建它然后填充,而不是使用附加例子。

尽管必须创建列表,但效率方面的许多改进都来自对该结构的操作。读/写/计算/等。