numpy.vectorize调用遇维度错误,求正确向量化解法
问题分析
你遇到的问题有两个核心原因:
np.vectorize的signature参数定义错误:你的func实际接受一维数组h和标量no,返回一个标量,而非你写的(k),(n)->(n)。- 原始
func依赖列表推导式和enumerate,无法直接处理数组类型的no,导致无signature时触发TypeError。
另外要注意:np.vectorize本质是Python循环的封装,并非真正的向量化运算,效率远低于直接用numpy广播实现的向量化逻辑。
解决方案
方案1:修正np.vectorize的用法
调整signature参数为(k),()->(),表示输入是长度为k的一维数组、标量,输出是标量。vectorize会自动遍历nos的每个元素传入func:
import numpy as np h = np.array([1,2,3]) nos = np.array([4, 5, 6, 7]) func = lambda h, no: np.sum([hk * np.exp(-1j * no * k) for k, hk in enumerate(h)]) # 修正后的vectorize调用 H = np.vectorize(func, excluded={'h'}, signature='(k),()->()') resps = H(h, nos) print(resps) # 输出和非向量化代码一致
方案2:真正的向量化实现(推荐)
利用numpy的广播机制,完全避免循环,效率更高:
import numpy as np h = np.array([1,2,3]) nos = np.array([4, 5, 6, 7]) # 生成k的数组:[0,1,2] k = np.arange(len(h)) # 广播运算:nos变为(4,1),k变为(1,3),相乘后得到(4,3)的数组 exp_term = np.exp(-1j * nos[:, None] * k) # 与h相乘后沿axis=1求和,得到(4,)的结果数组 resps = np.sum(h * exp_term, axis=1) print(resps) # 输出:array([-0.74378734-1.45446975j, # -0.94989022+3.54991188j, # 5.45190245+2.16854975j, # 2.91801616-4.28579526j])
内容的提问来源于stack exchange,提问作者mins
相关产品推荐
相关产品推荐

