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

ece*_*ulm 25 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]])
Run Code Online (Sandbox Code Playgroud)

和以下函数(sigmoid/logistic):

import math
def myfunc(z):
    return 1/(1+math.exp(-z))
Run Code Online (Sandbox Code Playgroud)

我想获得一个新的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]])
Run Code Online (Sandbox Code Playgroud)

ece*_*ulm 18

显然,将函数应用于元素的方法是将函数转换为矢量化版本,该数组将数组作为输入并将数组作为输出返回.

您可以使用numpy.vectorize以下方法轻松地将函数转换为矢量化形式:

myfunc_vec = np.vectorize(myfunc)
result = myfunc_vec(mymatrix)
Run Code Online (Sandbox Code Playgroud)

或一次性使用:

np.vectorize(myfunc)(mymatrix)
Run Code Online (Sandbox Code Playgroud)

正如@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)
Run Code Online (Sandbox Code Playgroud)

由于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
Run Code Online (Sandbox Code Playgroud)

  • 为了性能,你应该使用NumPy ufuncs - `1 /(1 + np.exp(-mymatrix))`. (3认同)