Для всех голосов mmwrite
ответ я удивлен, что никто не пытался ответить на реальный вопрос. Но поскольку он был реактивирован, я попробую.
Это воспроизводит случай OP:
In [90]: x=sparse.csr_matrix(np.arange(10).reshape(2,5))
In [91]: np.save('save_sparse.npy',x)
In [92]: X=np.load('save_sparse.npy')
In [95]: X
Out[95]:
array(<2x5 sparse matrix of type '<type 'numpy.int32'>'
with 9 stored elements in Compressed Sparse Row format>, dtype=object)
In [96]: X[()].A
Out[96]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [93]: X[()].A
Out[93]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [94]: x
Out[94]:
<2x5 sparse matrix of type '<type 'numpy.int32'>'
with 9 stored elements in Compressed Sparse Row format
[()]
, что `user4713166 дал нам это не«трудный путь», чтобы извлечь разреженный массив.
np.save
и np.load
предназначены для работы с ndarrays. Но разреженная матрица не является таким массивом, и не является подклассом (как np.matrix
). Похоже, что np.save
обертывает объект без массива в object dtype array
и сохраняет его вместе с маринованной формой объекта.
При попытке сохранить другой тип объекта, который не может быть маринованные, я получаю сообщение об ошибке по адресу:
403 # We contain Python objects so we cannot write out the data directly.
404 # Instead, we will pickle it out with version 2 of the pickle protocol.
-> 405 pickle.dump (массив, ∥f∥p, протокол = 2)
Так в ответ на Is Scipy smart enough to understand that it has loaded a sparse array?
, no. np.load
не знает о редких массивах.Но np.save
достаточно умен, чтобы плутать при задании чего-то, что не является массивом, и np.load
делает то, что может, с чем, если находит в файле.
Что касается альтернативных методов экономии и загрузки разреженных массивов, то упоминается метод совместимости с MATLAB io.savemat
. Это был бы мой первый выбор. Но этот пример также показывает, что вы можете использовать обычный Python pickling
. Это может быть лучше, если вам нужно сохранить определенный разреженный формат. И np.save
неплохо, если вы можете жить с шагом извлечения [()]
. :)
https://github.com/scipy/scipy/blob/master/scipy/io/matlab/mio5.py write_sparse
- разреженный сохраняются в формате csc
. Наряду с заголовками он сохраняет A.indices.astype('i4'))
, A.indptr.astype('i4'))
, A.data.real
и дополнительно A.data.imag
.
В быстрых тестов я считаю, что np.save/load
обрабатывает все редкие форматы, за исключением dok
, где load
сетует недостающий shape
. В противном случае я не нахожу специальный код травления в разреженных файлах.
+1, 'scipy.io' является правильным решением. Я бы добавил, что если вы хотите спуститься по дороге оптимизации, вы можете рассмотреть «numpy.load (mmap_mode = 'r'/'c')'. Память, сопоставляющая файлы с диска, дает мгновенную загрузку ** и ** может сохранять память, так как один и тот же массив с отображением памяти может использоваться совместно несколькими процессами. – Radim
scipy.io.savemat, вероятно, лучший – mathtick
Использование np_savez вместо mm уменьшило время загрузки большой разреженной матрицы от 8min47 до 3s! Благодаря ! Я также попытался savez_compressed, но размер тот же, и время загрузки намного дольше. – MatthieuBizien