np.vectorize处理二维NumPy数组传参异常的解决方法(函数不可改)
问题分析
np.vectorize 不是用来处理子数组级别的操作的——它的核心是把函数映射到单个元素上。你传入的 each 是长度为3的数组,a1 是3×3的数组,vectorize会自动广播这两个输入,把它们拆成3×3的元素对逐个传给fun,所以fun拿到的是单个numpy.int64值,调用len()自然报错。
解决方案(无需修改
fun函数) 方案1:列表推导式手动遍历
直接遍历a1的每一行,和each配对调用fun,最后把结果转成numpy数组:
import numpy as np def fun(arr1, arr2): print(arr1) print(arr2) sum = 0 for i in range(len(arr1)): sum += arr1[i] * arr2[i] return sum a1 = np.array([[1, 4, 2], [5, 6, 3], [4, 0, 1]]) a2 = np.array([[1, 5, 5], [2, 5, 3]]) for each in a2: # 遍历a1的每一行,调用fun计算内积 result = np.array([fun(each, row) for row in a1]) print(result)
方案2:用np.apply_along_axis
利用numpy的apply_along_axis函数,指定按行遍历a1,把每一行和each配对传入fun:
import numpy as np def fun(arr1, arr2): print(arr1) print(arr2) sum = 0 for i in range(len(arr1)): sum += arr1[i] * arr2[i] return sum a1 = np.array([[1, 4, 2], [5, 6, 3], [4, 0, 1]]) a2 = np.array([[1, 5, 5], [2, 5, 3]]) for each in a2: # axis=1表示按行处理a1,每一行作为参数传给lambda result = np.apply_along_axis(lambda row: fun(each, row), axis=1, arr=a1) print(result)
两种方案都能输出你预期的结果:
[31 50 9] [28 49 11]
内容的提问来源于stack exchange,提问作者Gireesh
相关产品推荐
相关产品推荐

