tdc*_*tdc 5 python matlab sparse-array hdf5 sparse-matrix
我是python的新手,来自matlab.我有一个以matlab v7.3(HDF5)格式保存的大型稀疏矩阵.到目前为止,我已经找到了两种加载文件的方法,使用h5py和tables.然而,在矩阵上运行似乎非常缓慢.例如,在matlab中:
>> whos
Name Size Bytes Class Attributes
M 11337x133338 77124408 double sparse
>> tic, sum(M(:)); toc
Elapsed time is 0.086233 seconds.
Run Code Online (Sandbox Code Playgroud)
使用表格:
t = time.time()
sum(f.root.M.data)
elapsed = time.time() - t
print elapsed
35.929461956
Run Code Online (Sandbox Code Playgroud)
使用h5py:
t = time.time()
sum(f["M"]["data"])
elapsed = time.time() - t
print elapsed
Run Code Online (Sandbox Code Playgroud)
(我放弃了等待......)
[编辑]
根据@bpgergo的评论,我应该补充说我已经尝试通过以下两种方式将by h5py(f)中加载的结果转换为numpy数组或scipy稀疏数组:
from scipy import sparse
A = sparse.csc_matrix((f["M"]["data"], f["M"]["ir"], f["tfidf"]["jc"]))
Run Code Online (Sandbox Code Playgroud)
要么
data = numpy.asarray(f["M"]["data"])
ir = numpy.asarray(f["M"]["ir"])
jc = numpy.asarray(f["M"]["jc"])
A = sparse.coo_matrix(data, (ir, jc))
Run Code Online (Sandbox Code Playgroud)
但这两项行动都非常缓慢.
这里有什么我想念的吗?
大多数问题是您sum在有效的内存映射数组上使用 python(即它在磁盘上,而不是在内存中)。
首先,您将比较从磁盘读取内容所需的时间与读取内存中内容所需的时间。如果您想与 matlab 中所做的进行比较,请先将数组加载到内存中。
其次,python 的内置函数sum对于 numpy 数组来说效率非常低。(或者更确切地说,独立迭代 numpy 数组的每个项目非常慢,这就是 python 内置函数sum所做的。)使用numpy.sum(yourarray)oryourarray.sum()代替 numpy 数组。
举个例子:
(使用h5py,因为我更熟悉它。)
import h5py
import numpy as np
f = h5py.File('yourfile.hdf', 'r')
dataset = f['/M/data']
# Load the entire array into memory, like you're doing for matlab...
data = np.empty(dataset.shape, dataset.dtype)
dataset.read_direct(data)
print data.sum() #Or alternately, "np.sum(data)"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2901 次 |
| 最近记录: |