是否有任何简单的方法来稀疏地存储在Python中的冗余模式的矩阵?

问题描述:

类型我正在与从矢量创建处理,如下所示矩阵的:是否有任何简单的方法来稀疏地存储在Python中的冗余模式的矩阵?

开始与长度L.

的1-d矢量V为从V创建矩阵A具有N行,从V的第i个条目开始,使V的第N个条目成为第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]]) 

这是一个观点,不是你的原始数据,例如副本

>>> 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触发副本的任何操作,因为这会从天花板上发送您的内存使用。

+0

如果我需要将这些类型的几个矩阵连接在一起,该怎么办?将vstack或hstack工作,如果没有,如何创建两个数组串联的视图,而不是串联它们? – user1123936 2013-03-23 03:34:05

+0

@ user1123936所有你可以做的视图是玩弄形状和步幅。虽然这是一个非常强大的工具,但它只适用于非常重要的内存块。如果您尝试堆叠视图,则会触发副本。 – Jaime 2013-03-23 04:58:32

如Jaime解释的那样,如果您已经在使用numpy,请使用它的跨步或稀疏数组。

如果你是不是已经在使用numpy,你可以强烈考虑使用它。

如果您需要坚持使用纯Python,有三种明显的方法可以做到这一点,这取决于您的使用情况。

对于stripe或sparse-but-clustered的数组,您可以有效执行与numpy相同的操作。或者你可以使用一个简单的游程长度编码方案,再加上一个更高级别的游程列表,或者指向每个第N个元素的指针列表,或者甚至是整个这样的列表堆栈(每100个一个数组)元素,每10000个一个,等等)。

但是对于大多数一致密集的数组,最简单的事情是简单地将dictdefaultdict映射索引存储为值。随机访问查找或更新仍然是O(1) - 虽然具有较高的常数因子 - 并且您浪费存储(实际上)散列,键和值的存储空间,而不是每个非默认元素的值更多而不是通过存储默认元素的值来弥补,只要你的密度小于0.33。