Python 具有3D阵列的Scipy稀疏点积

Python 具有3D阵列的Scipy稀疏点积,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,我必须在2D和3D阵列之间执行点积,这对于numpy阵列来说很好。但是,当2D数组为稀疏格式时,其.dot()方法的行为方式不同,并引发以下错误: ValueError:无法解释维度 以下是这种情况的一个例子: import numpy as np import scipy as sp Cshape = (36, 3, 101) Pshape = (36, 36) C = np.zeros(Cshape) for i in range(Cshape[0]): for j in ran

我必须在2D和3D阵列之间执行点积,这对于numpy阵列来说很好。但是,当2D数组为稀疏格式时,其
.dot()
方法的行为方式不同,并引发以下错误:

ValueError:无法解释维度

以下是这种情况的一个例子:

import numpy as np
import scipy as sp

Cshape = (36, 3, 101)
Pshape = (36, 36)

C = np.zeros(Cshape)
for i in range(Cshape[0]):
    for j in range(Cshape[1]):
        for k in range(Cshape[2]):
            C[i,j,k] = (i+1)*100+(j+1)*10+k+1

P = np.zeros(Pshape)
for i in range(Pshape[0]):
    for j in range(Pshape[1]):
        P[i,j] = i*j

test1 = P.T.dot(np.swapaxes(C,0,1))

P = sp.sparse.csr_matrix(P)
test2 = P.T.dot(np.swapaxes(C,0,1))

测试1将导致我正在寻找的输出,测试2将抛出一个错误。在不调用
.todense()
方法的情况下,如何高效地执行此操作?

A
sparse.matrix
根据定义是2d
matrix
P
是稀疏的,
P.T
也是稀疏的。在P.T.dot(…)中使用时,它尝试进行2d矩阵乘法。如果参数也是稀疏的,则结果将是稀疏的。如果参数是稠密的,(numpy数组),则结果也是稠密的。但是没有处理3d数组的规定。你能把计算写成3个点积吗?重塑
C
到(36303),进行2d计算,并根据需要重塑。谢谢,我会尝试将
C
重塑为2d数组,重塑点积的输出。