如何在numpy数组中对所有元素应用自定义函数且不使用for循环?
解决方案
分两种场景实现,都不需要你手动编写for循环:
- 如果你的
sigmoid函数内部所有运算都支持numpy广播机制(比如只用到numpy内置的向量化运算,没有仅适配单个数值的逻辑),可以直接把整个数组作为参数传入函数,是效率最高的方案:
# 举个支持广播的sigmoid实现示例,你的实际实现只要符合广播要求就可以用 def sigmoid(self, x): return 1 / (1 + np.exp(-x)) a = np.array([1, 2, 3, 4, 5, 6]) a = sigmoid(a)
- 如果你的
sigmoid函数只能接收单个数值作为输入,不支持数组运算,可以用numpy内置的np.vectorize()方法包装函数,包装后即可直接传入数组批量处理:
a = np.array([1, 2, 3, 4, 5, 6]) # 包装自定义函数 vectorized_sigmoid = np.vectorize(sigmoid) # 直接传入数组调用,如果sigmoid是类实例方法,要注意传入self参数 a = vectorized_sigmoid(self, a)
注意:
np.vectorize本质是语法糖,内部还是会遍历每个元素调用原函数,不会提升运算效率,仅能帮你简化代码。如果追求性能,优先考虑把sigmoid改造为支持numpy广播的版本。
内容的提问来源于stack exchange,提问作者Jongmin Ahn
相关产品推荐
相关产品推荐

