我有一个函数 gen(),它返回一个由 nElements 个 float 组成的 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
那么,有没有办法在保持预分配数组速度的同时实现相同的一行?
谢谢,
-内特
请您参考如下方法:
这可能无法直接回答您的问题,但由于您在标题中提到了 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。可能不那么重要。
