Python 将外部产品的3D numpy数组存储到块对角稀疏矩阵中
我有一个大小为1000 x 100的numpy数组C。我已经知道了如何计算它的换位行的外积矩阵 这将生成一个1000x100x100 numpy数组D。我想将每个D[I,:,:]存储为大小为1000*100^2 x 1000*100^2的稀疏矩阵的块对角线之一。我可以使用scipy.sparse.block_diag实现这一点 E=spsppar.block_diag(D,“lil”) 我想知道是否有一种更有效的方法来做到这一点。E的一些条目首先需要被操纵(因此是“lil”)。所得矩阵将用于求解稀疏线性系统序列Python 将外部产品的3D numpy数组存储到块对角稀疏矩阵中,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我有一个大小为1000 x 100的numpy数组C。我已经知道了如何计算它的换位行的外积矩阵 这将生成一个1000x100x100 numpy数组D。我想将每个D[I,:,:]存储为大小为1000*100^2 x 1000*100^2的稀疏矩阵的块对角线之一。我可以使用scipy.sparse.block_diag实现这一点 E=spsppar.block_diag(D,“lil”) 我想知道是否有一种更有效的方法来做到这一点。E的一些条目首先需要被操纵(因此是“lil”)。所得矩阵将用于求
提前感谢。您的代码在我的机器上运行不到五秒钟,似乎运行正常。你对效率的要求/目标是什么?我需要迭代求解y=(E+Q(k))*xk'是一个迭代索引,Q(k)是另一个非常稀疏的矩阵。在我的机器上,代码也只需不到5秒钟。我希望它会更快。与解决方案时间相比,构建
E
的时间是多少<代码>稀疏非常擅长转换格式以适应操作。例如,计算可能是通过csr
完成的。您还可以计算在不同格式之间转换所需的时间。block_diag
的默认值是coo
coo
到csr的速度很快。从lil
到/从lil
的速度较慢。我尝试过简化block_diag
,但只得到了30-40%的加速。我想知道是否有一种方法可以从D计算E+Q(k),而不实际构造E,也许是通过巧妙的索引技巧。如果是这样的话,这可能要快得多。