You need to enable JavaScript to run this app. Numpy向量化操作时如何正确排除指定数组参数以避免运行报错?
优惠活动
大模型
产品
解决方案
定价
更多

Numpy向量化操作时如何正确排除指定数组参数以避免运行报错?

你遇到的错误是因为np.vectorize默认期望被包装的函数返回标量值,而你的myfunc返回的是长度为1的numpy数组,不是标量。

根因分析

  • np.where(d[:,0] == x)返回的是索引数组,用它切片d[:,1]得到的结果还是数组,例如myfunc(t, 't3')的返回值是array(['1'], dtype='<U1'),而非字符串标量'1'
  • np.vectorize会先调用一次你的函数推断输出数组的dtype,遇到返回的数组时无法将其作为单个元素写入结果数组,就抛出了ValueError: setting an array element with a sequence
  • 你设置的excluded=['d']是正确的,这个参数的作用是指定不需要迭代的参数,会原样传给myfunc,和本次报错无关。

解决方案

方案1(最推荐,符合你的预期输出)

修改myfunc,让它返回标量,取返回数组的第一个元素即可:

import numpy as np

t = np.array([['t1', 0],['t2',0],['t3',1],['t4',1]])
i = np.array(['t3', 't4'])

def myfunc(d, x): 
    # 加[0]取第一个元素,返回标量
    return d[:,1][np.where(d[:,0] == x)][0]

vfunc = np.vectorize(myfunc, excluded=['d'])
print(vfunc(d=t,x=i))

运行后输出就是你期望的array(['1', '1'], dtype='<U2')。

方案2(不修改原函数)

显式指定otypes参数,告诉np.vectorize输出类型为对象,允许存入数组:

vfunc = np.vectorize(myfunc, excluded=['d'], otypes=[object])

这个方案返回的每个元素是长度为1的数组,需要再做一次提取才能得到你要的结果,不如方案1方便。

补充:相关官方文档翻译

np.vectorize的核心逻辑说明:

该函数用于将普通Python函数包装为支持数组输入的向量化版本,默认会执行一次测试调用,根据返回值推断输出数组的dtype。如果函数返回值的结构非预期,需要显式指定otypes参数来定义输出类型。
excluded参数接受参数名或位置索引的列表,被指定的参数不会参与向量化迭代,每次调用都会原样传递给原始函数。


内容的提问来源于stack exchange,提问作者user3329732

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 00:57:04