用Python表加载Matlab稀疏矩阵

用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'

我最初问了一个相关的问题,但似乎没有什么进展。也许如果我把它的一部分重新表述得更具体一些,可能会有所帮助

我使用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']
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有什么意义?)

我没有在您的原始帖子中看到这一点,但我认为您的问题在于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
),底层数据(a
numpy.ndarray
)存储在
data.value
。但是,我不熟悉
pyh5
,因为我自己没有使用过它,所以我不确定这方面的限制是什么

一般来说,
PyTables
pyh5
具有不同的设计目标,因此应以不同的方式使用
pyh5
为HDF文件提供了一个更像Numpy的接口,而
PyTables
提供了更复杂的数据库操作。请参见
pyh5
PyTables
文档和Enthound邮件列表中的差异讨论:


这些错误来自scipy。你能检查一下say just numpy对
数据
ir
jc
进行操作的能力吗。numpy对数据(即数据类型、形状等)有什么看法?结果和你期望的一样吗?它们是否符合调用签名在
scipy.sparse.csc_矩阵中的期望值?啊,是的,似乎我所要做的就是:
M=sparse.csc_矩阵((f2.root.M.data[…],f2.root.M.ir[…],f2.root.M.jc[…])
还不确定第二个问题吗?似乎PyTables上只有元素操作可用?非常有用的答案,谢谢。慢慢来处理这个问题!我认为PyTables将为我们的项目提供一些有用的功能,因为可伸缩性非常重要。