我正在处理的矩阵类型是从向量创建的,如下所示:
从长度为 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/