用Python表加载Matlab稀疏矩阵
我最初问了一个相关的问题,但似乎没有什么进展。也许如果我把它的一部分重新表述得更具体一些,可能会有所帮助 我使用Matlab的稀疏格式(HDF5,csc I)存储文件 相信),我正试图使用Pytables直接对它们进行操作, 但是还没有成功。使用h5py,我可以执行以下操作:用Python表加载Matlab稀疏矩阵,python,matlab,numpy,scipy,sparse-matrix,Python,Matlab,Numpy,Scipy,Sparse Matrix,我最初问了一个相关的问题,但似乎没有什么进展。也许如果我把它的一部分重新表述得更具体一些,可能会有所帮助 我使用Matlab的稀疏格式(HDF5,csc I)存储文件 相信),我正试图使用Pytables直接对它们进行操作, 但是还没有成功。使用h5py,我可以执行以下操作: # Method 1: uses h5py (WORKS) f1 = h5py.File(fname) data = f1['M']['data'] ir = f1['M']['ir'] jc = f1['M']['jc'
# Method 1: uses h5py (WORKS)
f1 = h5py.File(fname)
data = f1['M']['data']
ir = f1['M']['ir']
jc = f1['M']['jc']
M = scipy.sparse.csc_matrix((data, ir, jc))
>>> import tables
>>> import numpy as np
>>> h5_file = tables.openFile(fname)
>>> data = f2.root.M.data
但如果我尝试在Pytables中执行相同的操作:
# Method 2: uses pyTables (DOESN'T WORK)
f2 = tables.openFile(fname)
data = f2.root.M.data
ir = f2.root.M.ir
jc = f2.root.M.jc
M = scipy.sparse.csc_matrix( (data,ir,jc) )
此操作失败(经过长时间等待),并出现以下错误:
TypeError Traceback (most recent call last)
/home/tdiethe/BMJ/<ipython console> in <module>()
/usr/lib/python2.6/dist-packages/scipy/sparse/compressed.pyc in __init__(self, arg1, shape, dtype, copy, dims, nzmax)
56 self.indices = np.array(indices, copy=copy)
57 self.indptr = np.array(indptr, copy=copy)
---> 58 self.data = np.array(data, copy=copy, dtype=getdtype(dtype, data))
59 else:
60 raise ValueError, "unrecognized %s_matrix constructor usage" %\
/usr/lib/python2.6/dist-packages/scipy/sparse/sputils.pyc in getdtype(dtype, a, default)
69 canCast = False
70 else:
---> 71 raise TypeError, "could not interpret data type"
72 else:
73 newdtype = np.dtype(dtype)
TypeError: could not interpret data type
我有两个问题:
- 如何使用pytables加载此文件
- 我是否需要执行到scipy稀疏矩阵的转换,以便能够对其执行操作,或者我可以直接对磁盘文件执行操作(矩阵乘法等…),即不将文件加载到内存中(如果不是,使用pytables有什么意义?)
# Method 1: uses h5py (WORKS)
f1 = h5py.File(fname)
data = f1['M']['data']
ir = f1['M']['ir']
jc = f1['M']['jc']
M = scipy.sparse.csc_matrix((data, ir, jc))
>>> import tables
>>> import numpy as np
>>> h5_file = tables.openFile(fname)
>>> data = f2.root.M.data
此时,data
不是numpy
数组:
>>> type(data)
tables.array.Array
>>> isinstance(data, np.ndarray)
False
tables.array.array
会立即加载底层数组,或立即公开类似数组的功能。这就是在scipy
中尝试使用这些类型的对象创建稀疏数组时导致错误的原因
相反,由PyTables
生成的data
对象旨在通过其他命令提供对数据的访问(即,通过使用奇特的索引[…]
)。在这种方法中,您可以通过执行data[:]
或data.read()
来访问部分或全部数据。只有在这一点上,才会产生熟悉的numpy
数组
有关tables.array.array
类的更多信息,请参阅或的获取实际数据
部分,以获取访问基础数据的示例
相比之下,可以生成更多类似数组的对象,尽管仍然不是numpy
array。考虑:
>>> import pyh5
>>> f1 = h5py.File(fname)
>>> data = f1['M']['data']
>>> type(data)
h5py._hl.dataset.Dataset
>>> isinstance(data, np.ndarray)
>>> False
但是,您可以立即对data
执行numpy
操作,如调用scipy
,或更简单的操作,如np.cos(data)
或data+np.arange(len(data))
。另外,data
对象似乎有一些熟悉的numpy
类属性(即shape
),底层数据(anumpy.ndarray
)存储在data.value
。但是,我不熟悉pyh5
,因为我自己没有使用过它,所以我不确定这方面的限制是什么
一般来说,PyTables
和pyh5
具有不同的设计目标,因此应以不同的方式使用pyh5
为HDF文件提供了一个更像Numpy的接口,而PyTables
提供了更复杂的数据库操作。请参见pyh5
、PyTables
文档和Enthound邮件列表中的差异讨论:
数据
、ir
或jc
进行操作的能力吗。numpy对数据(即数据类型、形状等)有什么看法?结果和你期望的一样吗?它们是否符合调用签名在scipy.sparse.csc_矩阵中的期望值?啊,是的,似乎我所要做的就是:M=sparse.csc_矩阵((f2.root.M.data[…],f2.root.M.ir[…],f2.root.M.jc[…])
还不确定第二个问题吗?似乎PyTables上只有元素操作可用?非常有用的答案,谢谢。慢慢来处理这个问题!我认为PyTables将为我们的项目提供一些有用的功能,因为可伸缩性非常重要。