From 7e8e0444d7bd39eed208e83e008ba56fa9087216 Mon Sep 17 00:00:00 2001 From: Hameer Abbasi Date: Thu, 22 Apr 2021 11:18:24 +0200 Subject: [PATCH] Add DOK sparse constructor. --- .../sparse.DOK.from_scipy_sparse.rst | 6 ++++ docs/generated/sparse.DOK.rst | 2 ++ sparse/_dok.py | 32 +++++++++++++++++++ sparse/tests/test_dok.py | 9 ++++++ 4 files changed, 49 insertions(+) create mode 100644 docs/generated/sparse.DOK.from_scipy_sparse.rst diff --git a/docs/generated/sparse.DOK.from_scipy_sparse.rst b/docs/generated/sparse.DOK.from_scipy_sparse.rst new file mode 100644 index 00000000..671b6c77 --- /dev/null +++ b/docs/generated/sparse.DOK.from_scipy_sparse.rst @@ -0,0 +1,6 @@ +DOK.from\_scipy\_sparse +======================= + +.. currentmodule:: sparse + +.. automethod:: DOK.from_scipy_sparse \ No newline at end of file diff --git a/docs/generated/sparse.DOK.rst b/docs/generated/sparse.DOK.rst index be825c89..30efa70b 100644 --- a/docs/generated/sparse.DOK.rst +++ b/docs/generated/sparse.DOK.rst @@ -36,6 +36,8 @@ DOK DOK.from_coo DOK.from_numpy + + DOK.from_scipy_sparse DOK.to_coo diff --git a/sparse/_dok.py b/sparse/_dok.py index 419a7f03..8bb4721d 100644 --- a/sparse/_dok.py +++ b/sparse/_dok.py @@ -3,6 +3,7 @@ from collections.abc import Iterable import numpy as np +import scipy.sparse from numpy.lib.mixins import NDArrayOperatorsMixin from ._slicing import normalize_index @@ -106,6 +107,11 @@ def __init__(self, shape, data=None, dtype=None, fill_value=None): self._make_shallow_copy_of(ar) return + if isinstance(shape, scipy.sparse.spmatrix): + ar = DOK.from_scipy_sparse(shape) + self._make_shallow_copy_of(ar) + return + self.dtype = np.dtype(dtype) if not data: @@ -127,6 +133,32 @@ def __init__(self, shape, data=None, dtype=None, fill_value=None): else: raise ValueError("data must be a dict.") + @classmethod + def from_scipy_sparse(cls, x): + """ + Create a :obj:`DOK` array from a :obj:`scipy.sparse.spmatrix`. + + Parameters + ---------- + x : scipy.sparse.spmatrix + The matrix to convert. + + Returns + ------- + DOK + The equivalent :obj:`DOK` array. + + Examples + -------- + >>> x = scipy.sparse.rand(6, 3, density=0.2) + >>> s = DOK.from_scipy_sparse(x) + >>> np.array_equal(x.todense(), s.todense()) + True + """ + from sparse import COO + + return COO.from_scipy_sparse(x).asformat(cls) + @classmethod def from_coo(cls, x): """ diff --git a/sparse/tests/test_dok.py b/sparse/tests/test_dok.py index 2ab8579f..c2dc7bec 100644 --- a/sparse/tests/test_dok.py +++ b/sparse/tests/test_dok.py @@ -47,6 +47,15 @@ def test_convert_to_numpy(): assert_eq(x, s) +def test_convert_from_scipy_sparse(): + import scipy.sparse + + x = scipy.sparse.rand(6, 3, density=0.2) + s = DOK(x) + + assert_eq(x, s) + + @pytest.mark.parametrize( "shape, data", [