为何numpy.vectorize调用向量化函数次数多于向量元素数,首元素被调用两次?
numpy.vectorize首元素被调用两次的原因与解决方法
原因
numpy.vectorize并非真正的向量化实现,它本质是对输入数组每个元素做循环调用的包装器。执行时,它会先调用一次第一个元素来推断输出结果的数据类型(dtype),这就导致首元素被额外多调用一次,总调用次数比元素总数多1。
比如你给出的示例代码:
import numpy @numpy.vectorize def test(x): print(x) test([1,2,3])
执行后输出里1出现两次,就是因为这个类型推断的额外调用。
消除副作用的解决方法
当函数存在副作用(比如统计计数、累加求和等场景)时,最直接可靠的方法是显式指定otypes参数,告诉vectorize输出的具体数据类型,这样它就不需要通过调用首元素来推断类型,自然不会产生额外调用。
修改后的示例代码:
import numpy @numpy.vectorize(otypes=[int]) # 根据函数实际输出类型指定,此处示例输出为整数 def test(x): print(x) test([1,2,3])
此时执行结果为:
1 2 3
每个元素仅被调用一次,副作用的异常效果就消除了。
内容的提问来源于stack exchange,提问作者vvch
相关产品推荐
相关产品推荐

