Skip to main content
 首页 » 编程设计

创建二维 numpy 数组的 Pythonic 方式

2025年05月04日12kevingrace

我有一个函数 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。可能不那么重要。