鉴于以下numpy矩阵:
import numpy as np
mymatrix = mymatrix = np.matrix('-1 0 1; -2 0 2; -4 0 4')
matrix([[-1, 0, 1],
[-2, 0, 2],
[-4, 0, 4]])
和以下函数(sigmoid / logistic):
import math
def myfunc(z):
return 1/(1+math.exp(-z))
我想得到一个新的numpy数组/矩阵,其中每个元素是将myfunc
函数应用于原始矩阵中相应元素的结果。
map(myfunc, mymatrix)
失败,因为它尝试将myfunc应用于行而不是每个元素。我尝试使用numpy.apply_along_axis
和numpy.apply_over_axis
,但它们也意味着将函数应用于行或列,而不是逐个元素。
那么如何将myfunc(z)
应用于myarray
的每个元素来获取:
matrix([[ 0.26894142, 0.5 , 0.73105858],
[ 0.11920292, 0.5 , 0.88079708],
[ 0.01798621, 0.5 , 0.98201379]])
答案 0 :(得分:10)
显然,将函数应用于元素的方法是将函数转换为矢量化版本,将数组作为输入并将数组作为输出返回。
您可以使用numpy.vectorize
轻松地将函数转换为矢量化形式,如下所示:
myfunc_vec = np.vectorize(myfunc)
result = myfunc_vec(mymatrix)
或一次性使用:
np.vectorize(myfunc)(mymatrix)
正如@Divakar指出的那样,如果你可以从头开始编写一个已经向量化的函数(使用numpy内置的ufuncs而不使用numpy.vectorize
),它会更好(性能方面) :
def my_vectorized_func(m):
return 1/(1+np.exp(-m)) # np.exp() is a built-in ufunc
myvectorized_func(mymatrix)
由于numpy.exp
已经过矢量化(并且math.exp
并非如此),因此整个表达式1/(1+np.exp(-m))
将被矢量化(并且将原始函数应用于每个元素的速度更快)。
以下完整示例生成了所需的输出:
import numpy as np
mymatrix = mymatrix = np.matrix('-1 0 1; -2 0 2; -4 0 4')
import math
def myfunc(z):
return 1/(1+math.exp(-z))
np.vectorize(myfunc)(mymatrix) # ok, but slow
def my_vectorized_func(m):
return 1/(1+np.exp(-m))
my_vectorized_func(mymatrix) # faster using numpy built-in ufuncs
答案 1 :(得分:0)
只要有帮助,scipy就有一个sigmoid函数,您可以直接在矩阵上调用。