为何np.vectorize封装的函数执行次数多于传入元素数量?——以单元素列表调用场景为例
Why does
np.vectorize call my function twice with a length-1 input? 这其实是np.vectorize一个容易踩的小坑——它会自动检测函数返回值的数据类型(dtype),而检测的方式就是先用输入的第一个元素调用一次你的函数。
具体到你的场景:
当你调用np.vectorize(f)(["input"])时,因为没有手动指定otypes参数,np.vectorize会先拿输入列表里的"input"调用一次f,目的是根据返回值推断最终要生成的numpy数组的dtype;完成类型推断后,它才会真正遍历输入的所有元素(这里只有一个"input"),再调用一次f。所以你会看到两次hi input的输出。
要解决这个问题,只需要在创建vectorized函数时手动指定otypes参数,告诉np.vectorize返回值的类型,这样它就不会额外调用一次函数来检测类型了:
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并不是真正的向量化实现(底层还是逐元素循环),它更多是为了让原本处理单个元素的函数能适配数组输入的语法糖。如果追求性能,建议直接用numpy的原生向量化操作,而不是依赖np.vectorize。
内容的提问来源于stack exchange,提问作者zabop
相关产品推荐
相关产品推荐

