Za wszystkie głosy w górę odpowiedzi mmwrite
jestem zaskoczony, że nikt nie próbował odpowiedzieć na pytanie. Ale odkąd został reaktywowany, spróbuję.
ten odtwarza sprawę 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
[()]
że `user4713166 dał nam nie jest„twardy”sposób wyodrębnić rzadki tablicę.
np.save
i np.load
są przeznaczone do pracy na ndarrays. Ale rzadka macierz nie jest taką tablicą, ani nie jest podklasą (tak jak jest to np.matrix
). Wygląda na to, że np.save
zawija obiekt nieszablonowy w postaci object dtype array
i zapisuje go wraz z piklowaną formą obiektu.
Gdy próbuję zapisać inny rodzaj obiektu, taki, który nie może być marynowane, pojawia się komunikat o błędzie na stronie:
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 (array, fp, protokół = 2)
Tak więc w odpowiedzi na Is Scipy smart enough to understand that it has loaded a sparse array?
, nie. np.load
nie wie o rzadkich tablicach.Ale np.save
jest na tyle sprytny, że daje punt, gdy otrzymuje coś, co nie jest tablicą, a np.load
robi to, co może, jeśli znajdzie w pliku.
Jeśli chodzi o alternatywne metody zapisywania i ładowania rzadkich macierzy, wspomniano o metodzie zgodnej z MATLAB, io.savemat
. To byłby mój pierwszy wybór. Ale ten przykład pokazuje również, że możesz używać zwykłego Pythona pickling
. To może być lepsze, jeśli chcesz zapisać konkretny format. I np.save
nie jest zły, jeśli możesz żyć z krokiem ekstrakcji [()]
. :)
https://github.com/scipy/scipy/blob/master/scipy/io/matlab/mio5.py write_sparse
- rzadki są zapisywane w formacie csc
. Wraz z nagłówkami zapisuje A.indices.astype('i4'))
, A.indptr.astype('i4'))
, A.data.real
i opcjonalnie A.data.imag
.
W szybkich testów uważam, że np.save/load
obsługuje wszystkie formaty rzadkie, z wyjątkiem dok
, gdzie load
o brakującym shape
. W przeciwnym razie nie znajdę żadnego specjalnego kodu wytrawiania w plikach rozrzedzonych.
+1, 'scipy.io' jest właściwym rozwiązaniem. Dodam, że jeśli chcesz zejść z drogi optymalizacji, możesz rozważyć opcję 'numpy.load (mmap_mode = 'r'/'c')'. Mapowanie pamięci plików z dysku daje natychmiastowe obciążenie ** i ** może zaoszczędzić pamięć, ponieważ ta sama tablica odwzorowana w pamięci może być współużytkowana w wielu procesach. – Radim
scipy.io.savemat jest prawdopodobnie najlepszym – mathtick
Użycie np_savez zamiast mm zmniejszyło mój czas ładowania dużej rozrzedzonej matrycy z 8min47 na 3s! Dzięki ! Próbowałem również savez_compressed, ale rozmiar jest taki sam, a czas ładowania znacznie dłuższy. – MatthieuBizien