我想计算单位矩阵的离散差分。下面的代码使用了numpy和scipy。
import numpy as np
from scipy.sparse import identity
from scipy.sparse import csc_matrix
x = identity(4).toarray()
y = csc_matrix(np.diff(x, n=2))
print(y)
我想提高性能或内存使用。由于单位矩阵产生很多零,以压缩稀疏列(csc)格式执行计算会减少内存使用。但是,np.diff()不接受csc格式,所以使用csc_matrix在csc和普通格式之间转换会稍微慢一点。
标准格式
x = identity(4).toarray()
print(x)
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
csc格式
x = identity(4)
print(x)
(0, 0) 1.0
(1, 1) 1.0
(2, 2) 1.0
(3, 3) 1.0
谢谢
2条答案
按热度按时间5jdjgkvh1#
这是我的黑客解决方案,以获得稀疏矩阵,因为你想要的。
L
-原始单位矩阵的长度,n
-np.diff
的参数。在你的问题中,它们是:
我的代码生成的
y
与您的代码相同,但没有csc和普通格式之间的转换。您的代码:
我的代码:
我注意到,在单位矩阵
n
上应用np.diff
多次后,各列的值是符号交替的二项式系数,这就是我的变量data
。那么我只是构造csc_matrix。
bfnvny8b2#
不幸的是,SciPy似乎没有提供任何工具来处理这种稀疏矩阵,不管怎样,通过巧妙地处理条目的索引和数据,我们可以直接模拟
np.diff(x,n)
。给定二维NumPy数组(矩阵)维度为
MxN
,np.diff()
将每列相乘(属于列索引y
)与-1
进行比较,并向其中添加下一列(列索引y+1
)。k
阶差正好是1
阶差的k
的迭代应用。0
阶的差正好返回输入矩阵。下面的方法利用了这一点,通过
sum_duplicates()
的加法迭代地消除重复的条目,将列数减一,并过滤无效的索引。此外,当差阶大于或等于输入矩阵的列数时,该方法输出维度为
Mx0
的空csc_matrix
。其与
这个恒等式也适用于其他差序