log2元素的两个numpy矩阵之间的矩阵乘法方法

时间:2020-11-04 16:09:07

标签: python numpy matrix logarithm

我有两个numpy个元素的a_log2b_log2矩阵,我想在它们之间执行矩阵乘法

log2

我曾经使用a = np.array([[0.4, 0.4, 0.2], [0.1, 0.5, 0.4]]) b = np.array([[0.3, 0.7], [0.5, 0.5], [0.2, 0.8]]) a_log2 = np.log2(a) b_log2 = np.log2(b) 执行e-based logarithms的矩阵乘法。这是我使用的代码(感谢Erik Parkinson在此线程Handling matrix multiplication in log space in Python中的回答):

scipy.special.logsumexp

现在,我需要您的帮助来执行 def log_space_product(A,B): Astack = np.stack([A]*A.shape[0]).transpose((2,1,0)) Bstack = np.stack([B]*B.shape[1]).transpose((1,0,2)) log_sum_exp = logsumexp(Astack+Bstack, axis=0) return log_sum_exp a_log2之间的矩阵乘法,因为尚未为b_log2定义scipy.special.logsumexp

注意: 我首先计划使用base-2 logarithmsnatural logarithms将矩阵元素转换为a_loge[i, j] = np.log(2**a_log2[i, j]),然后使用上述b_loge[i, j] = np.log(2**b_log2[i, j])方法执行矩阵乘法。

但是我拒绝这样做,因为最终将要使用的矩阵有log_space_product()行和> 1000列。 (请不要在这里与行数和列数混淆。我确实确保保持矩阵乘法属性。

1 个答案:

答案 0 :(得分:1)

请记住, log 2 (x)= ln(x)/ ln(2)。我们可以将其重写为 ln(x)= c log 2 (x),其中 c = ln(2)。因此,从底数到底数的日志空间之间的转换实际上就是一个乘法。

from scipy.special import logsumexp

def log_space_product(A, B, base=np.e):
    c = np.log(base)
    Astack = np.stack([A]*A.shape[0]).transpose(2,1,0)
    Bstack = np.stack([B]*B.shape[1]).transpose(1,0,2)
    return (1/c) * logsumexp(c*(Astack+Bstack), axis=0)