假设我有一个函数foo(),它接受一个float并返回一个float。将这个函数应用于numpy矩阵或数组中的每个元素的最快/最pythonic方法是什么?
我基本上需要的是此代码的一个版本,它不使用循环:
import numpy as np
big_matrix = np.matrix(np.ones((1000, 1000)))
for i in xrange(np.shape(big_matrix)[0]):
for j in xrange(np.shape(big_matrix)[1]):
big_matrix[i, j] = foo(big_matrix[i, j])
我试图在numpy文档中找到一些可以让我这样做的东西,但我还没有找到任何东西。
编辑:正如我在评论中提到的,特别是我需要使用的函数是sigmoid函数f(z) = 1 / (1 + exp(-z))
。
答案 0 :(得分:3)
如果foo
实际上是一个带标量的黑盒子,并返回一个标量,那么你必须使用某种迭代。人们经常尝试np.vectorize
并意识到,正如记录所述,它并没有加快速度。作为广播多种输入的方式,它是最有价值的。它使用np.frompyfunc
,稍快一点,但接口不太方便。
正确的numpy方式是更改您的功能,以便它适用于数组。这对你的评论中的功能来说不难做到
f(z) = 1 / (1 + exp(-z))
有一个np.exp
功能。剩下的就是简单的数学。