使用数组索引优化函数调用

时间:2017-11-15 06:39:22

标签: python numpy

我有一个带有以下原型的函数:

def fun(signal,const):
    n = len(signal);
    index = np.arange(n);
    F = np.sum(signal*np.exp((-2*np.pi*np.complex(1j)*const*index)/n));
    return F;

我想要的最终结果是输出:

for i in np.arange(4):
    out[i] = fun(inp,i)

如果没有循环并且没有矢量化lambda函数,我怎么能得到这个结果,因为我的理解是vectorize也使用了一个循环。我正在寻找一个来自numpy家族的功能来实现这一目标。

我没有运气就尝试了以下内容:

b= np.array([0,1,2,3]);
print(fun(inp,b));

上面的问题是它传递整个数组,我只需要传递当前索引。

1 个答案:

答案 0 :(得分:1)

只需稍加一点fun就可以使用数组const;将axis参数添加到sum

def fun(signal,const):
    n = len(signal);
    index = np.arange(n);
    F = np.sum(signal*np.exp((-2*np.pi*np.complex(1j)*const*index)/n),axis=-1);
    return F;

In [126]: signal = np.arange(10)*.1    
In [139]: for i in range(4):
     ...:     print(fun(signal,i))     
(4.5+0j)
(-0.5+1.53884176859j)
(-0.5+0.688190960236j)
(-0.5+0.363271264003j)

我通过提供列向量生成相同的数字:

In [142]: fun(signal, np.arange(4)[:,None])
Out[142]: 
array([ 4.5+0.j        , -0.5+1.53884177j, -0.5+0.68819096j,
       -0.5+0.36327126j])

constindex相乘以生成(4,n)数组:

In [143]: np.arange(4)[:,None]*np.arange(10)
Out[143]: 
array([[ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18],
       [ 0,  3,  6,  9, 12, 15, 18, 21, 24, 27]])

将其他标量与(n,)signal混合,保持(4,n)。对最后一个维度求和,结果是(4,)数组。

我最近解释了这种思维方式:

How do I shift my thinking to 'vectorize my computation' more than using 'for-loops'?