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

Python 使用数组索引优化函数调用,python,numpy,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函数的向

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

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函数的向量化,我怎么能得到这个结果,因为我的理解是向量化也使用循环。我正在寻找一个功能从numpy家庭来实现这一点

我尝试了以下方法,但运气不佳:

b= np.array([0,1,2,3]);
print(fun(inp,b));
上面的问题是它传递整个数组,而我需要的是只传递当前索引。

只需稍作更改,fun就可以处理数组常量;将轴参数添加到总和:

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

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])
该常数与索引相乘,生成一个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,信号,保持在4,n。在最后一个维度上求和,结果是4,数组

我在最近的一篇文章中解释了这种思维方式:


打印[DFTinp,b中x的x]怎么样?我不明白你的问题是什么。你建议你想要一个for循环的输出,你的问题标题建议你想要向量化这个计算,但是你说你想要避免向量化。你的目标是速度吗?将整个列表传递给函数并在函数中迭代要比调用循环中每个索引的函数调用开销快。你能提供一个完整的例子吗?例如inp和out没有定义。你能把函数改成与np.arange4一起使用,而不是标量i吗?在不了解DFT的情况下,我们无法提出改进建议。谢谢您的评论。我更新了问题。希望更清楚。
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]])