在Python中有效地向量化这个函数

问题描述 投票:0回答:1

问题描述

我编写了Python代码来计算以下函数,用于固定

y_i
和固定
z_i

enter image description here

在实践中,我将有许多不同的向量

x
,我想对其进行评估。我不想经历一个循环,而是想充分利用 NumPy 的矢量化和广播能力。

目标:编写一个Python函数,将形状为

X
的矩阵
(M, p)
作为输入,其中每一行都是不同的向量
x
,并为每一行计算上面的表达式,从而获得形状的输出
(M, p)

单一功能

def single_function(x):
    """Assumes y is a vector (n,) and Z is a matrix (n, p). These are fixed."""
    return x / (sigma**2) - gamma*np.sum((np.exp(-np.logaddexp(0.0, y*np.matmul(Z, x))) * y)[:, None] * Z, axis=0)

矢量化函数

我的尝试是错误的,但我不知道我错在哪里。

def vectorised(X):
    return X / (sigma**2) - gamma*np.matmul(np.exp(-np.logaddexp(0.0, y[None, :] * X.dot(Z.T))) * y[None, :], Z)
python numpy vectorization
1个回答
0
投票

用爱因斯坦表示法完成复杂的乘积通常会变得更容易理解。

def vectorized(X):
    """Assumes y is a vector (n,) and Z is a matrix (n, p). These are fixed."""

    E = np.exp(np.einsum("n, Mp, np-> nM", -y, X, Z))
    return (X / sigma ** 2) - gamma * np.einsum("nM, n, np -> Mp", E / (1 + E), y, Z)
© www.soinside.com 2019 - 2024. All rights reserved.