Python 如何对numpy矩阵中的每个元素执行操作?
假设我有一个函数foo(),它接受一个浮点数并返回一个浮点数。将此函数应用于numpy矩阵或数组中的每个元素的最快/最具python风格的方法是什么 我本质上需要的是一个不使用循环的代码版本:Python 如何对numpy矩阵中的每个元素执行操作?,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,假设我有一个函数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]
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
函数。剩下的是简单的数学 同意矢量化是答案。您需要重新思考函数foo()的作用,目前它在单个元素上工作。矢量化意味着一次对整个行/列进行操作,从而消除循环。np.vectorize
在一般情况下肯定是最“pythonic”的。但是,对于某些函数foo
,如果完全不使用函数并依赖numpy
向量运算,您可能会做得更好(因为np.vectorize
实际上并没有做任何事情来提高计算的性能)。我特别希望使用sigmoid函数,即f(z)=1/(1+exp(-z))
将exp(-z)
替换为np.exp(-z)
你的函数将被矢量化。然后它可以接受一个np.array作为输入,并返回正确的答案。这不是一个好的副本。它所建议的是np.vectorize
哪些循环。注释中有更好的答案。接受它是因为它回答了我的实际问题。我已经改变了我的问题以反映这一点。