Pythonic创建2D numpy数组的方法

1 python arrays 2d numpy

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

a = zeros((nSamples, nElements))
for i in xrange(nSamples):
     a[i,:] = gen()
Run Code Online (Sandbox Code Playgroud)

这是一种方法:

a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))
Run Code Online (Sandbox Code Playgroud)

但由于没有预先分配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)
Run Code Online (Sandbox Code Playgroud)

输出:

1.82166719437
0.502261161804
Run Code Online (Sandbox Code Playgroud)

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

谢谢,
-Nate

Eli*_*sky 9

这可能不会直接回答你的问题,但是因为你在标题中提到了Pythonic ......请理解Pythonic不一定是"单行"或最聪明和最短(按键击键)的做事方式.恰恰相反 - Pythonic代码力求清晰.

对于您的代码,我发现:

a = zeros((nSamples, nElements))
for i in xrange(nSamples):
     a[i,:] = gen()
Run Code Online (Sandbox Code Playgroud)

比以下更清楚:

a = array([gen() for i in xrange(nSamples)]).reshape((nSamples, nElements))
Run Code Online (Sandbox Code Playgroud)

因此,我不会说第二个更像Pythonic.可能不那么好了.