将(潜在的)稀疏矩阵包装为python中的numpy(密集)数组(矩阵)

时间:2015-11-19 02:35:32

标签: python-2.7 numpy sparse-matrix

我正在使用只接受numpy.array个对象的python库。但是,我的数据是高维的并且非常稀疏,并且将它加载到内存以便库获取整个数据是非常低效的。我在想一个包含稀疏矩阵的内存高效的python对象。我找到了scipy.sparse,但是库的方法(显然)拒绝了数据类型。我希望稀疏矩阵对象潜在(包裹)在一个numpy对象后面。

In [16]: x
Out[16]: 
<3x3 sparse matrix of type '<type 'numpy.float64'>'
   with 6 stored elements in Compressed Sparse Row format>

In [17]: print x
 (0, 0) 1.0
 (0, 2) 2.0
 (1, 2) 3.0
 (2, 0) 4.0
 (2, 1) 5.0
 (2, 2) 6.0
In [18]: y = wrapping_object(x)
Out[18]: 
matrix([[ 1.,  0.,  2.],
        [ 0.,  0.,  3.],
        [ 4.,  5.,  6.]])
In [19]: library.method(y)
Out[19]: 
True

我不知道是否有可能。感谢您提供交替或更简单的建议。

1 个答案:

答案 0 :(得分:0)

我不确定是否跟进。

x是一个稀疏矩阵。 library.method是期​​望密集(numpy)数组的函数。并且wrapping_object是您要查找的方法/类,这将使x看起来像y而不实际生成y(伴随内存消耗问题)?< / p>

x.toarray()(或x.A简短的属性表示法)是从稀疏获取密集数组的常用方法。 (x.todense()生成np.matrix版本)。所以fn = x.toarray是一个绑定函数,在执行时会生成密集数组。从某种意义上说它是一个包装器。但library.method不会以这种方式使用它,并且可能不接受它作为数组。

我们必须详细了解library.method如何使用y来了解是否有解决问题的方法。有时Python代码会检查输入的类,但更常见的是它只是尝试以预期的方式使用它,如果它没有正确响应则会引发错误。这是if it quacks like a duck it's a duck哲学。

稀疏矩阵在很多方面表现得像一个数组,但不是各方面。它有shapedtype,对索引做出响应,适用于x*3,但不适用于x+3等。

x的实际数据存储在3个数组x.datax.indicesx.indptr中。其他稀疏格式使用不同的属性。