You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:50:45