Я новичок в python, исходя из Matlab. У меня есть большая разреженная матрица, сохраненная в формате Matlab v7.3 (HDF5). Я до сих пор нашел два способа загрузки в файл, используя h5py
и tables
. Однако работа над матрицей, кажется, очень медленная после того, как. Например, в MATLAB:Загрузка Matlab разреженной матрицы, сохраненной с -v7.3 (HDF5) в Python и работающей на нем
>> whos
Name Size Bytes Class Attributes
M 11337x133338 77124408 double sparse
>> tic, sum(M(:)); toc
Elapsed time is 0.086233 seconds.
Использование таблиц:
t = time.time()
sum(f.root.M.data)
elapsed = time.time() - t
print elapsed
35.929461956
Использование h5py:
t = time.time()
sum(f["M"]["data"])
elapsed = time.time() - t
print elapsed
(я отказался ждать ...)
[EDIT]
Основано на комментариях от @bpgergo, я должен добавить, что я попытался преобразовывать результат загруженную в по h5py
(f
) в numpy
массив или scipy
разреженный массив в двух следующих способов:
from scipy import sparse
A = sparse.csc_matrix((f["M"]["data"], f["M"]["ir"], f["tfidf"]["jc"]))
или
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))
, но обе эти операции также очень медленны.
Есть ли что-то, что мне не хватает здесь?
Загрузка файла была почти мгновенной в Matlab (<1сек), поэтому я считаю, что сравнение было справедливым, но я хочу сказать о встроенной функции sum. Я думаю, что все больше и больше людей будут делать то, что я делаю (переход от Matlab к Python), поэтому было бы хорошо, если бы было немного больше поддержки для загрузки в файлах Matlab IMHO ... – tdc
Ну, я не могу протестируйте его без вашего файла, но на самом деле загрузка массива в python также должна быть очень быстрой. То, что вы сейчас делаете, на самом деле не загружает его. Он повторяет то, что эффективно представляет собой массив с памятью. Доступ к нему независимо будет очень медленным на любом языке, так как он в основном работает с дисками. Является ли приведенный выше примерный код еще медленным? Кроме того, посмотрите на 'scipy.io.loadmat' http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html#scipy.io.loadmat, хотя я не если он поддерживает разреженные массивы. –
еще не успел попробовать, но спасибо за вход – tdc