为何np.vectorize包装的函数执行次数多于传入元素数量?——单元素列表场景下执行两次的原因探究
为什么np.vectorize会让我的函数执行两次?
这个问题的核心原因是numpy.vectorize在初始化向量化函数时,会自动调用一次你的目标函数来推断输出数组的数据类型(dtype),再加上实际遍历输入元素的那次调用,就导致了函数被执行两次的现象。
具体细节拆解:
- np.vectorize的本质:它并不是真正的底层向量化实现(底层还是循环遍历元素),而是一个方便的包装器。为了生成符合numpy数组要求的返回值,它需要提前明确输出的dtype。
- 推断dtype的过程:当你没有显式指定
otypes参数时,vectorize会取输入的第一个元素(这里就是"input"),调用一次你的函数f,根据返回值来确定输出数组的dtype。 - 实际执行过程:完成dtype推断后,vectorize才会真正遍历输入的所有元素(这里输入是长度为1的列表,所以再调用一次
f)。
验证与解决方法:
如果你显式指定otypes参数,告诉vectorize输出的类型,它就不需要再调用函数来推断dtype,只会执行一次:
import numpy as np def f(x): print(f"hi {x}") return x # 指定otypes为字符串类型 print(np.vectorize(f, otypes=[str])(["input"]))
此时输出就会符合你的预期:
hi input ['input']
额外注意:
如果你的输入是空数组,vectorize的行为会有所不同(可能会抛出错误或者需要更明确的类型指定),但在你的场景中,输入长度为1,所以就是推断dtype的调用+实际执行的调用,导致了两次打印。
内容的提问来源于stack exchange,提问作者zabop
相关产品推荐
相关产品推荐

