我正在尝试创建一个对2-D矩阵求幂的函数,并将结果保存在3D数组中,其中第一个维度是对指数进行索引。这很重要,因为我要对矩阵求幂的行表示有关图上不同顶点的信息。因此,例如,如果我们有A,A ^ 2,A ^ 3,则每个形状都是(50,50),而我想要一个矩阵D =(3,50,50),这样我就可以得到D [:,1 ,: ]检索有关节点1的所有信息,并能够对其进行矩阵乘法。我的代码当前为
def expo(times,A,n):
temp = A;
result = csr_matrix.toarray(temp)
for i in range(0,times):
temp = np.dot(temp,A)
if i == 0:
result = np.array([result,csr_matrix.toarray(temp)]) # this creates a (2,50,50) array
if i > 0:
result = np.append(result,csr_matrix.toarray(temp),axis=0) # this does not work
return result
但是,这不起作用,因为在“ i> 0”情况下,临时数组的形状为(50,50),并且无法附加。我不确定如何进行这项工作,但我对Numpy中的维度感到困惑,例如为什么有时认为(50,1)而其他时候认为(50,)。任何人都可以帮助我使此代码正常工作,并在Numpy中一般性地解释如何完成这些事情?
如果要在numpy中堆叠矩阵,则可以使用stack
function。如果您还希望索引对应于指数,则可能要在输出的开头添加一个单位矩阵:
stack
如您所见,我们首先简单地创建矩阵列表,然后在最后将它们转换为数组。我不确定您是否真的需要3D数组,因为您也可以仅索引已创建的列表,但是这取决于您的用例(是否方便)。
我想许多numpy函数的import numpy as np
def expo(A, n):
result =[np.eye(len(A)), A,]
for _ in range(n-1):
result.append(result[-1].dot(A))
return np.stack(result, axis=0)
# If you do not really need the 3D array,
# you could also just return the list
result = expo(np.array([[1,-2],[-2,1]]), 3)
print(result)
# [[[ 1. 0.]
# [ 0. 1.]]
#
# [[ 1. -2.]
# [ -2. 1.]]
#
# [[ 5. -4.]
# [ -4. 5.]]
#
# [[ 13. -14.]
# [-14. 13.]]]
print(result[1])
# [[ 1. -2.]
# [-2. 1.]]
关键字参数起初可能会令人困惑,但是文档通常包含很好的示例,并且结合了相同的尝试和错误,应该会使您大为受益。例如,对于axis
,第一个示例确实正是您想要执行的操作。