我有一个带有以下原型的函数:
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));
上面的问题是它传递整个数组,我只需要传递当前索引。
答案 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])
此const
与index
相乘以生成(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'?