Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 3中创建任意维稀疏矩阵_Python_Python 3.x_Scipy_Sparse Matrix - Fatal编程技术网

在Python 3中创建任意维稀疏矩阵

在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

所以我使用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(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]]