我有一个函数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


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

谢谢,
-内特

最佳答案

我相信这会做你想要的:

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


由于我无权使用您的gen函数,因此我无法进行计时测试。同样,它(以及您的单行代码)不像for循环版本那样对内存友好。单行存储所有gen()输出,然后构造数组,而for循环一次只需要在内存中有一个gen()(以及numpy数组)。

08-18 13:43
查看更多