我想创建一个1列n行矩阵,用于PageRank算法的计算。如果我这样做,然后在计算中使用矩阵,它会得到这样的结果:
A = [[0.0375,0.4625,0.0375,0.32083333],
[0.0375, 0.0375,0.0375,0.32083333],
[0.8875, 0.0375, 0.0375, 0.32083333],
[0.0375, 0.4625, 0.8875, 0.0375]]
my_dp = 1/4
r = np.matrix([my_dp, my_dp, my_dp, my_dp])
r = np.transpose(r)
print(r)
for i in range(1,50):
r = A*r
print("Final:", print(r))
[[0.25]
[0.25]
[0.25]
[0.25]]
[[0.3570795 ]
[0.19760835]
[0.30663962]
[0.13867253]]
Final: None
但是如果我自动创建它,使用np。和。fill,我得到这个结果:
r = np.empty(n)
r.fill(my_dp)
r = r[None].T
print(r)
for i in range(1,50):
r = A*r
print("Final:", print(r))
[[0.25]
[0.25]
[0.25]
[0.25]]
[[3.35329783e-71 3.35329783e-71 7.21422583e-04 9.73677480e-18]
[1.60559016e-25 3.35329783e-71 3.35329783e-71 9.73677480e-18]
[1.60559016e-25 7.21422583e-04 3.35329783e-71 3.35329783e-71]
[1.60559016e-25 3.35329783e-71 3.35329783e-71 3.35329783e-71]]
Final: None
A
是一个nxn邻接矩阵。
为什么会这样?正如你所看到的,如果我打印这两个矩阵,它们看起来是一样的,它们应该是一样的。
我试着创建一个新的矩阵并用。fill填充它,我试着用。full创建一个矩阵,但一切都导致了第二个结果。它唯一正常工作的时候是当我手动创建矩阵时,这是不太可能的,因为要继续,我将需要在矩阵中有数百个元素。
这是不清楚可见的,但有两个例子之间的区别。
区别在于第一个r
是np.matrix
,第二个r
是np.array
。两者之间为数不多的区别之一是乘法运算符。在矩阵上使用*
进行矩阵乘法。在数组上使用*
会进行元素相乘,其中r
被广播以适合A
的形状。
如果你想要一个矩阵乘法,使用@
运算符:
r = A@r
numpy数组和矩阵有什么区别?我应该用哪一个?