创建二维数字阵列的python方法

2024-09-26 17:50:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数gen(),它返回一个由nElements个浮点数组成的numpy数组。我在找一条更像Python的(一条线?)方法如下:

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

这是一种方法:

^{pr2}$

但可以理解的是,由于没有预先分配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

那么,有没有一种方法可以在保持预先分配的数组速度的同时实现相同的一行程序呢?在

谢谢,
-奈特


Tags: 方法inimportnumpyfortimezeros数组
2条回答

这可能不能直接回答你的问题,但既然你在标题中提到了Python。。。请理解,Pythonic不一定是一种“单行线”或是最聪明和最简短(按键明智)的方法。恰恰相反-Python代码力求清晰。在

就你的代码而言,我发现:

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

比:

^{pr2}$

所以我不会说第二个更像Python。可能会少一些。在

我相信这会达到你想要的效果:

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

由于我无法访问您的gen函数,所以无法进行计时测试。而且,这个(以及你的一行程序)没有for loop版本的内存友好。一行程序存储所有gen()输出,然后构造数组,而for循环一次只需要在内存中有一个gen()(与numpy数组一起)。在

相关问题 更多 >

    热门问题