如何对numpy.vectorize的部分参数执行向量化处理?
解决np.vectorize参数形状不匹配的问题
问题出在np.vectorize默认会尝试对所有输入参数做广播匹配——你的第一个参数是18元素的数组,第二个是3元素的列表,形状无法对齐,所以触发报错。由于你需要将完整的字符串列表作为参数传递给每个函数调用,而非拆分元素,可通过以下几种方式解决:
方法一:使用excluded参数排除无需向量化的参数
通过excluded指定不需要被向量化处理的参数(可以是参数位置索引或参数名),这样np.vectorize会将该参数完整传递给每一次函数调用:
# 按参数位置排除(第二个参数,索引为1) vec_func = np.vectorize(self.my_function, excluded=[1]) my_ndarray = vec_func(my_ndarray, ["a", "b", "c"]) # 或按参数名称排除 vec_func = np.vectorize(self.my_function, excluded=['lookup']) my_ndarray = vec_func(my_ndarray, ["a", "b", "c"])
方法二:用lambda函数固定参数
把不需要向量化的参数提前绑定到lambda中,让np.vectorize只处理数组参数:
vec_func = np.vectorize(lambda num: self.my_function(num, ["a", "b", "c"])) my_ndarray = vec_func(my_ndarray)
方法三:直接使用列表推导(更直观)
由于np.vectorize本质是循环包装,并非真正的向量化优化,直接用列表推导遍历数组元素再转成numpy数组,效果完全一致:
my_ndarray = np.array([self.my_function(num, ["a", "b", "c"]) for num in my_ndarray])
内容的提问来源于stack exchange,提问作者Cashif Ilyas
相关产品推荐
相关产品推荐

