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.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。