如何在2d numpy数组/矩阵中应用每个元素的函数/映射值?
给定以下numpy矩阵:如何在2d numpy数组/矩阵中应用每个元素的函数/映射值?,numpy,Numpy,给定以下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): 我想得到一个新的numpy数组/矩阵,其中每个元素都是将myfunc函数应用于原始矩阵中相应元素的结果 映射(myfunc,my
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):
我想得到一个新的numpy数组/矩阵,其中每个元素都是将myfunc
函数应用于原始矩阵中相应元素的结果
映射(myfunc,mymatrix)
失败,因为它试图将myfunc应用于行而不是每个元素。我尝试使用numpy.apply_沿_轴
和numpy.apply_over_轴
,但它们也用于将函数应用于行或列,而不是逐个元素
那么如何将myfunc(z)
应用于myarray
的每个元素,以获得:
matrix([[ 0.26894142, 0.5 , 0.73105858],
[ 0.11920292, 0.5 , 0.88079708],
[ 0.01798621, 0.5 , 0.98201379]])
显然,将函数应用于元素的方法是将函数转换为向量化版本,该版本以数组作为输入,返回数组作为输出 使用
numpy.vectorize
可以轻松地将函数转换为矢量化形式,如下所示:
myfunc_vec = np.vectorize(myfunc)
result = myfunc_vec(mymatrix)
或一次性使用:
np.vectorize(myfunc)(mymatrix)
正如@Divakar所指出的,如果您可以从头开始编写一个已经矢量化的函数(使用构建的numpy而不使用numpy.vectorize
),则更好(性能方面):
由于已矢量化(而math.exp
未矢量化),整个表达式1/(1+np.exp(-m))
将矢量化(比将原始函数应用于每个元素更快)
以下完整示例生成了所需的输出:
import numpy as np
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
为了以防万一,scipy有一个可以直接调用矩阵的函数。为了提高性能,您应该使用NumPy ufuncs-
1/(1+np.exp(-mymatrix))
。我修改了答案,加入了一个使用内置NumPy.exp的版本,谢谢
def my_vectorized_func(m):
return 1/(1+np.exp(-m)) # np.exp() is a built-in ufunc
my_vectorized_func(mymatrix)
import numpy as np
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