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

Python log2元素的两个numpy矩阵之间的矩阵乘法方法,python,numpy,matrix,logarithm,Python,Numpy,Matrix,Logarithm,我有两个numpy矩阵a_log2和b_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) 我曾经使用scipy.special.logsumexp执行基

我有两个
numpy
矩阵
a_log2
b_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)
我曾经使用
scipy.special.logsumexp
执行基于e的对数的矩阵乘法。以下是我使用的代码(感谢Erik Parkinson在本文中的回答):

现在,我需要您的帮助来执行
a_log2
b_log2
之间的矩阵乘法,因为
scipy.special.logsumexp
不是为
base-2对数定义的

注意: 我首先计划使用
a_loge[I,j]=np.log(2**a_log2[I,j])
b_loge[I,j]=np.log(2**b_log2[I,j])
将矩阵元素转换为
自然对数,然后使用上述
log空间积()
方法执行矩阵乘法

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)
但我拒绝这样做,因为我最终将使用的矩阵有1000行和20列。(不要混淆这里的行数和列数。我确实确保矩阵乘法属性保持不变。)

记住log2(x)=ln(x)/ln(2)。我们可以用c=ln(2)重写为ln(x)=clog2(x)。因此,与具有不同基的日志空间的转换实际上是一次乘法

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)

非常感谢。顺便说一句,它不应该是“c=np.log(2)”而不是“c=np.log(np.e)”,因为我们的目标对数基数是2?@MdMorshedAlam我写了一个通用函数,我认为使用自然日志作为默认值最有意义。在您的情况下,因为您在一个使用base 2的日志空间中工作,所以您需要调用
log\u space\u product(a,B,base=2)
。明白了。谢谢你的帮助。