Python 带Numpy的矩阵乘法

Python 带Numpy的矩阵乘法,python,numpy,matrix-multiplication,Python,Numpy,Matrix Multiplication,假设我有一个亲和矩阵A和一个对角矩阵D。如何使用nympy计算Python中的拉普拉斯矩阵 L=D^(-1/2)A D^(1/2) 目前,我使用L=D**(-1/2)*A*D**(1/2)。这条路对吗 谢谢。好吧,我看到的唯一问题是,如果您使用的是Python 2.6.x(没有来自未来导入除法的),那么1/2将被解释为0,因为它将被视为整数除法。你可以用D**(-.5)*A*D**.5来解决这个问题。也可以使用1/2而不是1/2强制浮点除法 除此之外,我认为这是正确的 编辑: 我尝试对一个num

假设我有一个亲和矩阵A和一个对角矩阵D。如何使用nympy计算Python中的拉普拉斯矩阵

L=D^(-1/2)A D^(1/2)

目前,我使用L=D**(-1/2)*A*D**(1/2)。这条路对吗


谢谢。

好吧,我看到的唯一问题是,如果您使用的是Python 2.6.x(没有来自未来导入除法的
),那么1/2将被解释为0,因为它将被视为整数除法。你可以用D**(-.5)*A*D**.5来解决这个问题。也可以使用1/2而不是1/2强制浮点除法

除此之外,我认为这是正确的

编辑:

我尝试对一个numpy数组求幂,而不是之前的矩阵,它与
D**.5
一起工作。可以使用numpy.power对矩阵元素进行指数化。所以你就用

from numpy import power
power(D, -.5) * A * power(D, .5)

Numpy允许您直接使用正元素和正指数对对角线“矩阵”进行幂运算:

m = diag(range(1, 11))
print m**0.5
m = matrix([[1, 1], [1, 2]])
print m**0.5
结果就是您在本例中所期望的结果,因为NumPy实际上分别对NumPy数组的每个元素应用求幂运算

但是,它确实不允许您直接对任何NumPy矩阵求幂:

m = diag(range(1, 11))
print m**0.5
m = matrix([[1, 1], [1, 2]])
print m**0.5
生成您观察到的TypeError(例外情况是指数必须是整数–即使对于可以用正系数对角化的矩阵也是如此)


所以,只要矩阵D是对角的,指数是正的,你就可以直接使用你的公式。

numpy有矩阵的平方根函数吗?然后你可以用sqrt(D)代替(D**(1/2))

也许这个公式真的应该写出来

L = (D**(-1/2)) * A * (D**(1/2)) 

根据前面的评论,如果D是对角矩阵,这个公式应该有效(我现在没有机会证明它)。

请注意,建议使用numpy的
数组而不是
矩阵:请参见《用户指南》中的。一些回答中的混乱就是一个可能出错的例子。。。特别是,如果将D**0.5和产品应用于numpy阵列,则它们是元素级的,这会给您一个错误的答案。例如:

import numpy as np
from numpy import dot, diag
D = diag([1., 2., 3.])
print D**(-0.5)
[[ 1.                 Inf         Inf]
 [        Inf  0.70710678         Inf]
 [        Inf         Inf  0.57735027]]
在你的例子中,矩阵是对角的,所以矩阵的平方根就是另一个对角矩阵,它有对角元素的平方根。使用numpy数组,方程变为

D = np.array([1., 2., 3.]) # note that we define D just by its diagonal elements
A = np.cov(np.random.randn(3,100)) # a random symmetric positive definite matrix
L = dot(diag(D**(-0.5)), dot(A, diag(D**0.5)))

嗨,贾斯汀,谢谢你的回复。但是,我收到以下错误:“TypeError:exponent必须是整数”。您使用的是什么版本的Numpy?这些是正则矩阵还是稀疏矩阵。我对使用常规python矩阵并将其提升到一个新的高度没有任何问题。我很笨,使用的是np.array而不是np.matrix.Thx。我需要的是真正的矩阵运算,而不是点积或类似的东西(数组乘法)。对角矩阵不是一样吗?Thx。D实际上是一个对角矩阵。我现在可以了。diag(range(1,11))返回一个数组而不是矩阵,这就是原因。很好。这就是伯克斯在回答中所阐述的。我更新了这个答案,以明确这一点。