为何np.vectorize包装的函数执行次数多于输入元素数量?
为什么numpy.vectorize会让函数执行两次?
这是np.vectorize的内部机制导致的:它会先调用一次传入的函数,用来推断输出数组的数据类型(dtype),之后才会遍历输入元素真正执行函数。
具体到你的代码:
- 当你传入
["input"]这个列表时,np.vectorize会先取第一个元素"input"调用一次f,目的是确定返回值的类型,这就产生了第一次hi input的输出; - 完成类型推断后,它再对输入的每个元素(这里只有一个)执行
f,于是又打印了一次hi input; - 最后返回处理后的数组
['input'],和你看到的实际输出完全匹配。
解决方法:提前指定输出类型
如果你不想触发这次测试调用,可以给np.vectorize传入otypes参数,提前声明输出的数据类型,这样它就不需要调用函数来推断了:
import numpy as np def f(x): print(f"hi {x}") return x # 明确指定输出为字符串类型 vectorized_f = np.vectorize(f, otypes=[np.str_]) print(vectorized_f(["input"]))
运行这段代码就只会输出一次hi input和['input']。
另外要注意:np.vectorize只是个语法糖,内部还是逐个元素循环处理,并没有真正实现向量化运算,性能和普通Python循环没多大区别,不要指望它能提升计算速度。
内容的提问来源于stack exchange,提问作者zabop
相关产品推荐
相关产品推荐

