我正在使用只接受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
我不知道是否有可能。感谢您提供交替或更简单的建议。
答案 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
哲学。
稀疏矩阵在很多方面表现得像一个数组,但不是各方面。它有shape
,dtype
,对索引做出响应,适用于x*3
,但不适用于x+3
等。
x
的实际数据存储在3个数组x.data
,x.indices
,x.indptr
中。其他稀疏格式使用不同的属性。