假设我有一个函数foo(),它接受一个浮点值并返回一个浮点。将此函数应用于numpy矩阵或数组中的每个元素的最快/最Python的方法是什么?
我真正需要的是这个代码的一个不使用循环的版本:
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))
。
如果foo
真的是一个接受标量并返回标量的黑盒,那么您必须使用某种迭代。人们经常尝试np.vectorize
,并意识到,正如所记录的那样,它并不能加快速度。作为一种广播多种输入的方式,它是最有价值的。它使用np.frompyfunc
,速度稍快,但接口不太方便。
正确的numpy方法是更改函数,使其与数组一起工作。这应该不难与你的评论中的功能联系起来
f(z) = 1 / (1 + exp(-z))
有一个np.exp
函数。剩下的就是简单的数学。