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)
。明白了。谢谢你的帮助。