При всех голосах за ответ 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 (массив, fp, протокол = 2)
Так что в ответ на Is Scipy smart enough to understand that it has loaded a sparse array?
нет. np.load
не знает о разреженных массивах. Но np.save
достаточно умен, чтобы выдавать, когда ему дано что-то, что не является массивом, и np.load
делает то, что может, с тем, что если находит в файле.
Что касается альтернативных методов сохранения и загрузки разреженных массивов, был упомянут io.savemat
, совместимый с MATLAB метод. Это был бы мой первый выбор. Но этот пример также показывает, что вы можете использовать обычный 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
. В противном случае я не нахожу никакого специального кода для травления в разреженных файлах.