将结果添加到numpy数组中

时间:2013-02-24 12:30:55

标签: python numpy

我有一个类似这样的功能:

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循环都是非常低效的,而且我都在努力改进我的代码,并且运行的数量将足够大,以至于这种低效率并没有让我感觉到任何好处。

做出以下操作的最佳方式是什么,它会导致最小的开销:

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

1 个答案:

答案 0 :(得分:2)

你认为numpy.appendnumpy.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)。这不如重复附加并且不应该破坏性能 - 但是你必须编写一些包装代码。

  3. 您可以追求其他想法。在我的头顶,你可以

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

    2. 将结果保存在列表推导中(在运行之前忘记numpy)。如果返回的函数(a,b,c)不是结果;

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

      现在做一些改组以将结果变成你需要的形式。