如何在2d 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

给定以下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,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