python - 有什么简单的方法可以在 python 中稀疏地存储具有冗余模式的矩阵?

标签 python matrix python-2.7 numpy sparse-matrix

我正在处理的矩阵类型是从向量创建的,如下所示:

从长度为 L 的一维向量 V 开始。

要从具有 N 行的 V 创建矩阵 A,使 A 的第 i 列成为 V 的前 N ​​个条目,从 V 的第 i 个条目开始,只要 V 中还有足够的条目即可填写专栏。这意味着 A 有 L - N + 1 列。

这是一个例子:

V = [0, 1, 2, 3, 4, 5]
N = 3

A =
[0 1 2 3
 1 2 3 4
 2 3 4 5]

以这种方式表示矩阵需要比我的机器更多的内存。有什么合理的方法可以稀疏地存储这个矩阵吗?我目前存储 N * (L - N + 1) 个值,而我只需要存储 L 个值。

最佳答案

您可以按如下方式查看原始矢量:

>>> import numpy as np
>>> from numpy.lib.stride_tricks import as_strided
>>> 
>>> v = np.array([0, 1, 2, 3, 4, 5])
>>> n = 3
>>> 
>>> a = as_strided(v, shape=(n, len(v)-n+1), strides=v.strides*2)
>>> a
array([[0, 1, 2, 3],
       [1, 2, 3, 4],
       [2, 3, 4, 5]])

这是一个 View ,而不是原始数据的副本,例如

>>> v[3] = 0
>>> v
array([0, 1, 2, 0, 4, 5])
>>> a
array([[0, 1, 2, 0],
       [1, 2, 0, 4],
       [2, 0, 4, 5]])

但是您必须小心,不要对触发复制的 a 执行任何操作,因为这会使您的内存使用量达到上限。

关于python - 有什么简单的方法可以在 python 中稀疏地存储具有冗余模式的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15580575/

相关文章:

Python-PYGAME : How do I know if a mouse clicked on an image?

java - 用二进制数填充矩阵,常规和格雷编码

c++ - 如何读取 CSV 文件并分配给特征矩阵?

google-app-engine - python 应用引擎 dev_appserver 不可用 (1.7.6)

python-2.7 - 在python中使用sftp从远程路径获取文件到本地目录

python - 为什么长度为 1 的元组的元组实际上不是元组,除非我添加逗号?

Python 子进程 : why won't the list of arguments work analogous to the full shell string?

python - PyCharm:为什么只显示退出代码行?

python - 如果另一列中存在值,如何清除单元格中的值?

c - C 中的邻接矩阵上的 Dijkstra