将结果添加到numpy数组的矢量化

2024-09-28 05:24:38 发布

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

我有一个类似这样的函数:

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

我要做的是多次运行这个函数,将返回的一行五列结果附加到正在运行的数据集中。但据我所知,append函数和for循环都是非常低效的,我都在努力改进代码,而且运行的次数将足够多,这种低效对我没有任何好处。你知道吗

最好的方法是什么,以使其产生的开销最少:

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

Tags: 数据函数代码forreturndefnpzeros
1条回答
网友
1楼 · 发布于 2024-09-28 05:24:38

您正确地认为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)。这比重复追加要好得多,而且不会破坏性能,但是您必须编写一些包装器代码。

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

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

  2. 将结果保存在列表中(直到运行之后才忘记numpy)。If函数返回(a,b,c)not results;

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

现在做一些洗牌,把结果转换成你需要的形式。你知道吗

相关问题 更多 >

    热门问题