在Python 3中创建任意维稀疏矩阵
所以我使用Python3创建了一个表单的矩阵在Python 3中创建任意维稀疏矩阵,python,python-3.x,scipy,sparse-matrix,Python,Python 3.x,Scipy,Sparse Matrix,所以我使用Python3创建了一个表单的矩阵 L=[B 0 0 0 B 0 0 0 B] 在哪里 但是我不想重复B三次,而是想重复N次(取决于输入)。到目前为止,我的拍摄如下 import numpy as np import scipy.sparse as sp one=np.ones(N) four=4*np.ones(N) data = np.array([-one, four, -one]) diags = np.array([-1,0, 1]) B=sp.spdiags
L=[B 0 0
0 B 0
0 0 B]
在哪里
但是我不想重复B
三次,而是想重复N次(取决于输入)。到目前为止,我的拍摄如下
import numpy as np
import scipy.sparse as sp
one=np.ones(N)
four=4*np.ones(N)
data = np.array([-one, four, -one])
diags = np.array([-1,0, 1])
B=sp.spdiags(data, diags, N, N).toarray() # Create matrix B
L=np.kron(np.eye(N), B)
但是,当N
较大时,需要花费大量时间(这是必要的,因为这是为了求解微分方程)。有没有更有效的方法可以做到这一点?这里没有计时(我没有性能保证),但对我来说,最自然的方法(我对kronecker没有太多经验)是scipy的,尽管我总是怀疑我是否正确使用它(在本例中:列表理解):
代码
出来
这里没有时间安排(我没有性能保证),但对我来说,最自然的方法(我对kronecker没有太多经验)应该是scipy的,尽管我总是怀疑我是否正确使用它(在本例中:列表理解):
代码
出来
sparse.kron
更快。但是还是比<代码> NP.KRON/COD>慢得多。我总是想知道它是否是(并且还没有检查内部结构)。忽略API支持传递块矩阵的三种想法:生成器、列表理解或numpy数组。我想scipy需要访问len,所以发电机可能无法访问。另一方面,预先构建密集表示(重复)的内存效率不是很高(对于本用例)。有什么评论吗?对于一些内存高效的惰性生成器支持(包括先验维度),是否有一些优点?请查看block\u diag
的代码。它需要一个矩阵列表,然后将其转换为sparse.bmat
需要的嵌套列表输入bmat
然后收集所有矩阵的coo
属性,用适当的偏移量组合它们,并生成一个新的更大的coo
矩阵。它可以工作,但内部不是很漂亮。sparse.kron
更快。但是还是比<代码> NP.KRON/COD>慢得多。我总是想知道它是否是(并且还没有检查内部结构)。忽略API支持传递块矩阵的三种想法:生成器、列表理解或numpy数组。我想scipy需要访问len,所以发电机可能无法访问。另一方面,预先构建密集表示(重复)的内存效率不是很高(对于本用例)。有什么评论吗?对于一些内存高效的惰性生成器支持(包括先验维度),是否有一些优点?请查看block\u diag
的代码。它需要一个矩阵列表,然后将其转换为sparse.bmat
需要的嵌套列表输入bmat
然后收集所有矩阵的coo
属性,用适当的偏移量组合它们,并生成一个新的更大的coo
矩阵。它可以工作,但内部不是很漂亮。你需要一个稀疏矩阵结果吗?密集阵列构造几乎总是更快,但更快达到内存限制。是否需要稀疏矩阵结果?密集阵列构造几乎总是更快,但更快达到内存限制。
import numpy as np
import scipy.sparse as sp
one=np.ones(N)
four=4*np.ones(N)
data = np.array([-one, four, -one])
diags = np.array([-1,0, 1])
B=sp.spdiags(data, diags, N, N).toarray() # Create matrix B
L=np.kron(np.eye(N), B)
import numpy as np
import scipy.sparse as sp
N = 2
B = np.array([[4,-1,0],[-1,4,-1],[0,-1,4]])
L = sp.block_diag([B for i in range(N)])
print(L.todense())
[[ 4 -1 0 0 0 0]
[-1 4 -1 0 0 0]
[ 0 -1 4 0 0 0]
[ 0 0 0 4 -1 0]
[ 0 0 0 -1 4 -1]
[ 0 0 0 0 -1 4]]