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

Python 将结果添加到numpy数组的矢量化,python,numpy,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]

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

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循环都是非常低效的,我都在努力改进代码,运行的次数将非常多,这种低效对我没有任何好处

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

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

  • 您的想法是正确的,
    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]
    
    def函数(x,i,结果):
    结果[i,0]=a
    结果[i,1]=b
    结果[i,2]=c[-1,0]
    结果[i,3]=c[-1,1]
    结果[0,4]=c[-1,2]
    
    当然,如果您不知道要运行函数多少次,这将不起作用。在这种情况下,我建议采用不那么优雅的方法

  • 声明一个可能较大的
    results
    数组,并如上所述添加到
    results[i,x]
    (跟踪
    i
    和结果大小)

  • 当达到
    结果的大小时
    ,然后在一个新数组上执行
    numpy.append
    (或
    concatenate
    )。这比重复追加不那么糟糕,不会破坏性能,但您必须编写一些包装器代码

  • 你还可以追求其他的想法。从我的头脑中你可以

  • 将结果写入磁盘,这取决于返回三列数组的
    其他函数的速度以及数据的大小。这可能不是一个太愚蠢的想法

  • 将结果保存在列表中(直到运行之后才忘记
    numpy

  • results=[my_数据中x的函数(x)]


    现在进行一些洗牌,以将结果转换为所需的形式。

    然后如何调用该函数?您调用
    函数(x,i,results)
    传入您已经声明的
    i
    results
    results
    类似于
    results=np.zero((1000,5))
    1000次运行。如果其他函数运行缓慢,我认为将结果写入磁盘效果最好?因此处理器没有等待磁盘释放?确切地说-更好的做法是在工作进程运行时生成一个单独的进程来进行写入,这样两边都无需等待。而上面的函数调用-在for内-循环?您能否同时生成所有
    a
    s、
    b
    s和
    c
    s?在您的玩具示例中,您可以执行
    a,b=np.rand.rand(2,n)
    例如,如果你能用
    c
    做类似的事情,那么
    hstack
    将这3个数组进行转换,可能会大大超过你公认的答案。@Jamie不。虽然我可以一次生成a和B,但c调用的函数需要非常长的时间,并且需要a和c。