3

我有一个像这样工作的函数:

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 列结果附加到正在运行的数据集中。但是,据我所知,append 函数和 for 循环的效率都非常低,而且我都在尝试改进我的代码,并且运行次数将足够大,以至于这种低效率对我不起作用任何好处。

执行以下操作的最佳方法是什么,以使开销最小:

  1. 创建一个新的 numpy 数组来保存结果
  2. 将该函数的 N 次调用的结果插入到 1 中的数组中?
4

1 回答 1

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]

当然,如果你不知道你要运行多少次函数,这是行不通的。在这种情况下,我会建议一种不太优雅的方法;

  1. 声明一个可能很大的results数组并添加到results[i, x]上面(跟踪i结果的大小和大小。

  2. 当您达到 的大小时,请在新数组上results执行numpy.append(或)。concatenate这比重复附加要好,并且不应该破坏性能 - 但是您必须编写一些包装器代码。

您还可以追求其他想法。从我的头顶上你可以

  1. 将结果写入磁盘,具体取决于OtherFunctionThatReturnsAThreeColumnArray数据的速度和大小,这可能不是一个愚蠢的想法。

  2. 将您的结果保存在列表理解中(numpy直到运行后才忘记)。如果函数返回 (a, b, c) 没有结果;

results = [function(x) for x in my_data]

现在做一些洗牌,把结果变成你需要的形式。

于 2013-02-24T13:12:52.900 回答