Pythonic创建2D numpy数组的方法

时间:2011-03-22 11:14:54

标签: python arrays numpy 2d

我有一个函数gen(),它返回一个nElements个浮点数的numpy数组。我正在寻找更多的Pythonic(单线?)方式来做到以下几点:

a = zeros((nSamples, nElements))
for i in xrange(nSamples):
     a[i,:] = gen()

这是一种方法:

a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))

但由于没有预先分配numpy数组,可以理解的是有点慢:

import time
from numpy import *

nSamples  = 100000
nElements = 100

start = time.time()
a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))
print (time.time() - start)

start = time.time()
a = zeros((numSamples, nElements))
for i in xrange(numSamples):
    a[i,:] = gen()
print (time.time() - start)

输出:

1.82166719437
0.502261161804

那么,有没有办法在保持预分配阵列速度的同时实现相同的单线程?

谢谢,
-Nate

2 个答案:

答案 0 :(得分:9)

这可能无法直接回答您的问题,但由于您在标题中提到了 Pythonic ...请理解 Pythonic 不一定是“单行”或者最聪明,最短暂的(击键)方式。恰恰相反 - Pythonic代码力求清晰。

对于您的代码,我发现:

a = zeros((nSamples, nElements))
for i in xrange(nSamples):
     a[i,:] = gen()

比以下更清楚:

a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))

因此我不会说第二个更像Pythonic。可能不那么容易。

答案 1 :(得分:0)

我相信这会做你想做的事:

a = vstack([ gen() for _ in xrange(nSamples) ])

因为我无法访问您的gen功能,所以我无法进行计时测试。此外,这(以及你的单行)不如你的for循环版本那样对内存友好。单行存储所有gen()输出然后构造数组,而for循环一次只需要在内存中有一个gen()(以及numpy数组)。