我有一个类似这样的功能:
def Function(x):
a = random.random()
b = random.random()
c = OtherFunctionThatReturnsAThreeColumnArray()
results = np.zeros((1,5))
results[0,0] = a
results[0,1] = b
results[0,2] = c[-1,0]
results[0,3] = c[-1,1]
results[0,4] = c[-1,2]
return results
我要做的是多次运行此函数,将返回的一行,5列结果附加到正在运行的数据集。但是正如我所理解的那样,追加函数和for循环都是非常低效的,而且我都在努力改进我的代码,并且运行的数量将足够大,以至于这种低效率并没有让我感觉到任何好处。
做出以下操作的最佳方式是什么,它会导致最小的开销:
答案 0 :(得分:2)
你认为numpy.append
或numpy.concatenate
如果重复多次将会是昂贵的(这与numpy为前两个数组声明一个新数组有关)是正确的。
最佳建议(如果您知道总共需要多少空间)将在您运行例程之前声明,然后在结果可用时将其放置到位。
如果你要运行nrows
次,那么
results = np.zeros([nrows, 5])
然后添加结果
def function(x, i, results):
<.. snip ..>
results[i,0] = a
results[i,1] = b
results[i,2] = c[-1,0]
results[i,3] = c[-1,1]
results[0,4] = c[-1,2]
当然,如果你不知道你要运行多少次功能,这将无效。在那种情况下,我建议采用不太优雅的方法;
声明一个可能很大的results
数组并按上述方式添加到results[i, x]
(跟踪i
和结果的大小。
当您达到results
的尺寸时,请在新阵列上执行numpy.append
(或concatenate
)。这不如重复附加并且不应该破坏性能 - 但是你必须编写一些包装代码。
您可以追求其他想法。在我的头顶,你可以
将结果写入磁盘,具体取决于OtherFunctionThatReturnsAThreeColumnArray
的速度和数据大小,这可能不是太愚蠢。
将结果保存在列表推导中(在运行之前忘记numpy
)。如果返回的函数(a,b,c)不是结果;
results = [function(x) for x in my_data]
现在做一些改组以将结果变成你需要的形式。