1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
import numpy as np
from ._compressed import GCXS
from ._coo.core import COO
def save_npz(filename, matrix, compressed=True):
"""Save a sparse matrix to disk in numpy's ``.npz`` format.
Note: This is not binary compatible with scipy's ``save_npz()``.
This binary format is not currently stable. Will save a file
that can only be opend with this package's ``load_npz()``.
Parameters
----------
filename : string or file
Either the file name (string) or an open file (file-like object)
where the data will be saved. If file is a string or a Path, the
``.npz`` extension will be appended to the file name if it is not
already there
matrix : SparseArray
The matrix to save to disk
compressed : bool
Whether to save in compressed or uncompressed mode
Examples
--------
Store sparse matrix to disk, and load it again:
>>> import os
>>> import sparse
>>> import numpy as np
>>> dense_mat = np.array([[[0.0, 0.0], [0.0, 0.70677779]], [[0.0, 0.0], [0.0, 0.86522495]]])
>>> mat = sparse.COO(dense_mat)
>>> mat
<COO: shape=(2, 2, 2), dtype=float64, nnz=2, fill_value=0.0>
>>> sparse.save_npz("mat.npz", mat)
>>> loaded_mat = sparse.load_npz("mat.npz")
>>> loaded_mat
<COO: shape=(2, 2, 2), dtype=float64, nnz=2, fill_value=0.0>
>>> os.remove("mat.npz")
See Also
--------
load_npz
scipy.sparse.save_npz
scipy.sparse.load_npz
numpy.savez
numpy.load
"""
nodes = {
"data": matrix.data,
"shape": matrix.shape,
"fill_value": matrix.fill_value,
}
if type(matrix) == COO:
nodes["coords"] = matrix.coords
elif type(matrix) == GCXS:
nodes["indices"] = matrix.indices
nodes["indptr"] = matrix.indptr
nodes["compressed_axes"] = matrix.compressed_axes
if compressed:
np.savez_compressed(filename, **nodes)
else:
np.savez(filename, **nodes)
def load_npz(filename):
"""Load a sparse matrix in numpy's ``.npz`` format from disk.
Note: This is not binary compatible with scipy's ``save_npz()``
output. This binary format is not currently stable.
Will only load files saved by this package.
Parameters
----------
filename : file-like object, string, or pathlib.Path
The file to read. File-like objects must support the
``seek()`` and ``read()`` methods.
Returns
-------
SparseArray
The sparse matrix at path ``filename``.
Examples
--------
See :obj:`save_npz` for usage examples.
See Also
--------
save_npz
scipy.sparse.save_npz
scipy.sparse.load_npz
numpy.savez
numpy.load
"""
with np.load(filename) as fp:
try:
coords = fp["coords"]
data = fp["data"]
shape = tuple(fp["shape"])
fill_value = fp["fill_value"][()]
return COO(
coords=coords,
data=data,
shape=shape,
sorted=True,
has_duplicates=False,
fill_value=fill_value,
)
except KeyError:
pass
try:
data = fp["data"]
indices = fp["indices"]
indptr = fp["indptr"]
comp_axes = fp["compressed_axes"]
shape = tuple(fp["shape"])
fill_value = fp["fill_value"][()]
return GCXS(
(data, indices, indptr),
shape=shape,
fill_value=fill_value,
compressed_axes=comp_axes,
)
except KeyError as e:
raise RuntimeError(f"The file {filename!s} does not contain a valid sparse matrix") from e
|