如何在二维数组/矩阵中应用每个元素的函数/映射值?

根据以下数字矩阵:

import numpy as np
mymatrix = np.matrix('-1 0 1; -2 0 2; -4 0 4')




matrix([[-1,  0,  1],
[-2,  0,  2],
[-4,  0,  4]])

以及以下功能(乙状结肠/逻辑) :

import math
def myfunc(z):
return 1/(1+math.exp(-z))

我想得到一个新的 NumPy 数组/矩阵,其中每个元素都是将 myfunc函数应用于原始矩阵中相应元素的结果。

map(myfunc, mymatrix)失败是因为它试图将 myfunc 应用于行而不是每个元素。我尝试使用 numpy.apply_along_axisnumpy.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]])
112422 次浏览

显然,将函数应用于元素的方法是将函数转换为以数组作为输入、返回数组作为输出的向量化版本。

使用 numpy.vectorize可以很容易地将函数转换为矢量形式,如下所示:

myfunc_vec = np.vectorize(myfunc)
result = myfunc_vec(mymatrix)

或者一次性使用:

np.vectorize(myfunc)(mymatrix)

正如@Divakar 所指出的,如果你能从头开始编写一个已经向量化的函数(使用 NumPy 构建的 Ufuns而不使用 numpy.vectorize) ,那么效果会更好(性能方面) ,如下所示:

def my_vectorized_func(m):
return 1/(1+np.exp(-m))  # np.exp() is a built-in ufunc


my_vectorized_func(mymatrix)

因为 numpy.exp已经向量化了(而 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

以防万一,scypy 有一个 乙状结肠函数,您可以直接调用矩阵。