2013-03-03 34 views
2

如何优化涉及numpy数组的函数?函数和numpy数组预分配

使用案例:

def create_array_and_fill(a, b, N): 
    res = np.zeros(N, N) 

    res[0] = a 
    res[-1] = b 

    return res 

c = create_array_and_fill(5, 9, 100) 

不过,有时候,我事先知道,我需要使用(比如用于测试目的)的所有阵列的最大尺寸,有啥最好的方法?我应该预先分配吗?最好的办法是什么?例如,我可以将一个预分配的数组传递给一个函数,以便该函数只是更新它而不是返回一个新的数组?

我的第一个想法如下,但当然,它带有成本,我现在必须改变我所有的功能签名。

def create_array_and_fill(a, b, N, res): 

    res[0] = a 
    res[-1] = b 

    # No more return here? 

c = np.zeros(N, N) 
create_array_and_fill(a, b, N, c) 
+2

这取决于功能。如果该函数设置为允许传递预分配数组,则可以将预分配数组传递给函数。您需要更具体才能获得更具体的答案。 – BrenBarn 2013-03-03 01:06:51

+0

如果需要,我可以更改函数签名,但我该怎么做? – 2013-03-03 01:39:28

回答

2

如果我理解你的要求,你可以做这样的事情:

def fill_array(a, b, N, out=None): 
    if out is None: 
     out = np.zeros(N, N) 
    out[0] = a 
    out[-1] = b 
    return out 

这会修改out对象,如果提供一个,或返回一个新的,如果没有提供out 。在这种情况下,即使修改现有值,它仍然会返回该值,但如果提供了explit; icit out,您可以轻松修改它以返回None。

但是,如果您希望它们以任一方式工作(使用给定“out”数组或创建新数组),您将不得不更改函数。如果你在一个创建一个新数组的函数中编写代码,那么没有什么不可思议的方法可以使它不会仅仅因为你有另一个预先创建的数组而执行该代码。你必须编辑你的功能。