codecov[bot]: # [Codecov](https://codecov.io/gh/pydata/sparse/pull/182?src=pr&el=h1) Report
> Merging [#182](https://codecov.io/gh/pydata/sparse/pull/182?src=pr&el=desc) into [master](https://codecov.io/gh/pydata/sparse/commit/b03b6b9a480a10a3cf59d7994292b9c5d3015cd5?src=pr&el=desc) will **decrease** coverage by `0.11%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/pydata/sparse/pull/182/graphs/tree.svg?width=650&token=H212u0Uxxw&height=150&src=pr)](https://codecov.io/gh/pydata/sparse/pull/182?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #182      +/-   ##
==========================================
- Coverage    97.3%   97.19%   -0.12%     
==========================================
  Files          11       11              
  Lines        1301     1319      +18     
==========================================
+ Hits         1266     1282      +16     
- Misses         35       37       +2
```


| [Impacted Files](https://codecov.io/gh/pydata/sparse/pull/182?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [sparse/utils.py](https://codecov.io/gh/pydata/sparse/pull/182/diff?src=pr&el=tree#diff-c3BhcnNlL3V0aWxzLnB5) | `100% <ø> (+1.59%)` | :arrow_up: |
| [sparse/coo/umath.py](https://codecov.io/gh/pydata/sparse/pull/182/diff?src=pr&el=tree#diff-c3BhcnNlL2Nvby91bWF0aC5weQ==) | `97.32% <100%> (+0.49%)` | :arrow_up: |
| [sparse/coo/core.py](https://codecov.io/gh/pydata/sparse/pull/182/diff?src=pr&el=tree#diff-c3BhcnNlL2Nvby9jb3JlLnB5) | `96.81% <100%> (+0.02%)` | :arrow_up: |
| [sparse/compatibility.py](https://codecov.io/gh/pydata/sparse/pull/182/diff?src=pr&el=tree#diff-c3BhcnNlL2NvbXBhdGliaWxpdHkucHk=) | `50% <0%> (-33.34%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/pydata/sparse/pull/182?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pydata/sparse/pull/182?src=pr&el=footer). Last update [b03b6b9...a0ca82a](https://codecov.io/gh/pydata/sparse/pull/182?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

diff --git a/docs/changelog.rst b/docs/changelog.rst
index 934a70c..1682517 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -1,6 +1,7 @@
 Changelog
 =========
 
+* :feature:`124` (via :issue:`182`) Allow mixed :code:`ndarray`-:obj:`COO` operations if the result is sparse.
 * :feature:`179` (via :issue:`180`) Allow specifying a fill-value when converting from NumPy arrays.
 * :feature:`175` Added :code:`COO.any` and :code:`COO.all` methods.
 * :feature:`172` Indexing for :code:`COO` now accepts a single one-dimensional array index.
diff --git a/docs/operations.rst b/docs/operations.rst
index 524f2af..fbfa8e9 100644
--- a/docs/operations.rst
+++ b/docs/operations.rst
@@ -51,7 +51,12 @@ Auto-Densification
 ~~~~~~~~~~~~~~~~~~
 Operations that would result in dense matrices, such as
 operations with :doc:`Numpy arrays <reference/generated/numpy.ndarray>`
-objects a :obj:`ValueError`.
+raises a :obj:`ValueError`. For example, the following will raise a
+:obj:`ValueError` if :code:`x` is a :obj:`numpy.ndarray`:
+
+.. code-block:: python
+
+   x + y
 
 However, all of the following are valid operations.
 
@@ -77,9 +82,21 @@ If densification is needed, it must be explicit. In other words, you must call
 :obj:`COO.todense` on the :obj:`COO` object. If both operands are :obj:`COO`,
 both must be densified.
 
-.. warning:: Previously, operations with Numpy arrays were sometimes supported. Now,
-   it is necessary to convert Numpy arrays to :obj:`COO` objects.
+Operations with NumPy arrays
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In certain situations, operations with NumPy arrays are also supported. For example,
+the following will work if :code:`x` is :obj:`COO` and :code:`y` is a NumPy array:
+
+.. code-block:: python
+
+   x * y
+
+The following conditions must be met when performing element-wise operations with
+NumPy arrays:
 
+* The operation must produce a consistent fill-values. In other words, the resulting
+  array must also be sparse.
+* Operating on the NumPy arrays must not increase the size when broadcasting the arrays.
 
 Operations with :obj:`scipy.sparse.spmatrix`
 --------------------------------------------
diff --git a/sparse/coo/core.py b/sparse/coo/core.py
index 3f5d47b..1131e18 100644
--- a/sparse/coo/core.py
+++ b/sparse/coo/core.py
@@ -1317,6 +1317,11 @@ class COO(SparseArray, NDArrayOperatorsMixin):
                [15, 16, 17, 18, 19],
                [20, 21, 22, 23, 24]])
         """
+        if isinstance(shape, Iterable):
+            shape = tuple(shape)
+        else:
+            shape = (shape,)
+
         if self.shape == shape:
             return self
         if any(d == -1 for d in shape):
diff --git a/sparse/coo/umath.py b/sparse/coo/umath.py
index 8b3e15f..dcb3e52 100644
--- a/sparse/coo/umath.py
+++ b/sparse/coo/umath.py
@@ -1,11 +1,11 @@
-from itertools import product
+import itertools
 
 import numba
 import numpy as np
 import scipy.sparse
 
 from ..compatibility import range, zip, zip_longest
-from ..utils import isscalar, PositinalArgumentPartial, equivalent
+from ..utils import isscalar, equivalent, _zero_of_dtype
 
 
 def elemwise(func, *args, **kwargs):
@@ -43,35 +43,8 @@ def elemwise(func, *args, **kwargs):
     Previously, operations with Numpy arrays were sometimes supported. Now,
     it is necessary to convert Numpy arrays to :obj:`COO` objects.
     """
-    # Because we need to mutate args.
-    from .core import COO
-    from ..sparse_array import SparseArray
-
-    args = list(args)
-    posargs = []
-    pos = []
-    for i, arg in enumerate(args):
-        if isinstance(arg, scipy.sparse.spmatrix):
-            args[i] = COO.from_scipy_sparse(arg)
-        elif isscalar(arg) or (isinstance(arg, np.ndarray) and not arg.shape):
-            # Faster and more reliable to pass ()-shaped ndarrays as scalars.
-            args[i] = np.asarray(arg)[()]
-
-            pos.append(i)
-            posargs.append(args[i])
-        elif isinstance(arg, SparseArray) and not isinstance(arg, COO):
-            args[i] = COO(arg)
-        elif not isinstance(arg, COO):
-            return NotImplemented
-
-    # Filter out scalars as they are 'baked' into the function.
-    func = PositinalArgumentPartial(func, pos, posargs)
-    args = [arg for arg in args if not isscalar(arg)]
 
-    if len(args) == 0:
-        return func(**kwargs)
-
-    return _elemwise_n_ary(func, *args, **kwargs)
+    return _Elemwise(func, *args, **kwargs).get_result()
 
 
 @numba.jit(nopython=True, nogil=True)
@@ -116,207 +89,6 @@ def _match_arrays(a, b):  # pragma: no cover
     return np.array(a_ind, dtype=np.uintp), np.array(b_ind, dtype=np.uintp)
 
 
-def _elemwise_n_ary(func, *args, **kwargs):
-    """
-    Apply a function to any number of arguments with broadcasting.
-
-    Parameters
-    ----------
-    func : Callable
-        The function to apply to arguments. Must support broadcasting.
-    args : list
-        Input :obj:`COO` or :obj:`numpy.ndarray`s.
-    kwargs : dict
-        Additional arguments to pass to the function.
-
-    Returns
-    -------
-    COO
-        The output array.
-
-    Raises
-    ------
-    ValueError
-        If the input shapes aren't compatible or the result will be dense.
-    """
-    from .core import COO
-
-    args = list(args)
-
-    args_fill_values = tuple(arg.fill_value[...] for arg in args)
-    func_fill_value = func(*args_fill_values, **kwargs)
-
-    data_list = []
-    coords_list = []
-
-    cache = {}
-    for mask in product([True, False], repeat=len(args)):
-        if not any(mask):
-            continue
-
-        ci, di = _unmatch_coo(func, args, mask, cache, func_fill_value, **kwargs)
-
-        coords_list.extend(ci)
-        data_list.extend(di)
-
-    result_shape = _get_nary_broadcast_shape(*[arg.shape for arg in args])
-
-    # Concatenate matches and mismatches
-    data = np.concatenate(data_list) if len(data_list) else np.empty((0,), dtype=func_fill_value.dtype)
-    coords = np.concatenate(coords_list, axis=1) if len(coords_list) else \
-        np.empty((0, len(result_shape)), dtype=np.intp)
-
-    return COO(coords, data, shape=result_shape, has_duplicates=False, fill_value=func_fill_value)
-
-
-def _match_coo(*args, **kwargs):
-    """
-    Matches the coordinates for any number of input :obj:`COO` arrays.
-    Equivalent to "sparse" broadcasting for all arrays.
-
-    Parameters
-    ----------
-    args : Tuple[COO]
-        The input :obj:`COO` arrays.
-    return_midx : bool
-        Whether to return matched indices or matched arrays. Matching
-        only supported for two arrays. ``False`` by default.
-    cache : dict
-        Cache of things already matched. No cache by default.
-
-    Returns
-    -------
-    matched_idx : List[ndarray]
-        The indices of matched elements in the original arrays. Only returned if
-        ``return_midx`` is ``True``.
-    matched_arrays : List[COO]
-        The expanded, matched :obj:`COO` objects. Only returned if
-        ``return_midx`` is ``False``.
-    """
-    from .core import COO
-    from .common import linear_loc
-
-    return_midx = kwargs.pop('return_midx', False)
-    cache = kwargs.pop('cache', None)
-
-    if kwargs:
-        raise ValueError('Unknown kwargs %s' % kwargs.keys())
-
-    if return_midx and (len(args) != 2 or cache is not None):
-        raise NotImplementedError('Matching indices only supported for two args, and no cache.')
-
-    matched_arrays = [args[0]]
-    cache_key = [id(args[0])]
-    for arg2 in args[1:]:
-        cache_key.append(id(arg2))
-        key = tuple(cache_key)
-        if cache is not None and key in cache:
-            matched_arrays = cache[key]
-            continue
-
-        cargs = [matched_arrays[0], arg2]
-        current_shape = _get_broadcast_shape(matched_arrays[0].shape, arg2.shape)
-        params = [_get_broadcast_parameters(arg.shape, current_shape) for arg in cargs]
-        reduced_params = [all(p) for p in zip(*params)]
-        reduced_shape = _get_reduced_shape(arg2.shape,
-                                           reduced_params[-arg2.ndim:])
-
-        reduced_coords = [_get_reduced_coords(arg.coords, reduced_params[-arg.ndim:])
-                          for arg in cargs]
-
-        linear = [linear_loc(rc, reduced_shape) for rc in reduced_coords]
-        sorted_idx = [np.argsort(idx) for idx in linear]
-        linear = [idx[s] for idx, s in zip(linear, sorted_idx)]
-        matched_idx = _match_arrays(*linear)
-
-        if return_midx:
-            matched_idx = [sidx[midx] for sidx, midx in zip(sorted_idx, matched_idx)]
-            return matched_idx
-
-        coords = [arg.coords[:, s] for arg, s in zip(cargs, sorted_idx)]
-        mcoords = [c[:, idx] for c, idx in zip(coords, matched_idx)]
-        mcoords = _get_matching_coords(mcoords, params, current_shape)
-        mdata = [arg.data[sorted_idx[0]][matched_idx[0]] for arg in matched_arrays]
-        mdata.append(arg2.data[sorted_idx[1]][matched_idx[1]])
-        # The coords aren't truly sorted, but we don't need them, so it's
-        # best to avoid the extra cost.
-        matched_arrays = [
-            COO(mcoords, md, shape=current_shape, sorted=True, has_duplicates=False)
-            for md in mdata]
-
-        if cache is not None:
-            cache[key] = matched_arrays
-
-    return matched_arrays
-
-
-def _unmatch_coo(func, args, mask, cache, func_fill_value, **kwargs):
-    """
-    Matches the coordinates for any number of input :obj:`COO` arrays.
-
-    First computes the matches, then filters out the non-matches.
-
-    Parameters
-    ----------
-    func : Callable
-        The function to compute matches
-    args : tuple[COO]
-        The input :obj:`COO` arrays.
-    mask : tuple[bool]
-        Specifies the inputs that are zero and the ones that are
-        nonzero.
-    kwargs: dict
-        Extra keyword arguments to pass to func.
-
-    Returns
-    -------
-    matched_coords : list[ndarray]
-        The matched coordinates.
-    matched_data : list[ndarray]
-        The matched data.
-    """
-    from .core import COO
-
-    matched_args = [a for a, m in zip(args, mask) if m]
-    unmatched_args = [a for a, m in zip(args, mask) if not m]
-
-    matched_arrays = _match_coo(*matched_args, cache=cache)
-
-    pos = tuple(i for i, m in enumerate(mask) if not m)
-    posargs = [arg.fill_value[...] for arg, m in zip(args, mask) if not m]
-    result_shape = _get_nary_broadcast_shape(*[arg.shape for arg in args])
-
-    partial = PositinalArgumentPartial(func, pos, posargs)
-    matched_func = partial(*[a.data for a in matched_arrays], **kwargs)
-
-    unmatched_mask = ~equivalent(matched_func, func_fill_value)
-
-    if not unmatched_mask.any():
-        return [], []
-
-    func_data = matched_func[unmatched_mask]
-    func_coords = matched_arrays[0].coords[:, unmatched_mask]
-
-    # The coords aren't truly sorted, but we don't need them, so it's
-    # best to avoid the extra cost.
-    func_array = COO(func_coords, func_data, shape=matched_arrays[0].shape,
-                     sorted=True, has_duplicates=False).broadcast_to(result_shape)
-
-    if all(mask):
-        return [func_array.coords], [func_array.data]
-
-    unmatched_mask = np.ones(func_array.nnz, dtype=np.bool)
-
-    for arg in unmatched_args:
-        matched_idx = _match_coo(func_array, arg, return_midx=True)[0]
-        unmatched_mask[matched_idx] = False
-
-    coords = np.asarray(func_array.coords[:, unmatched_mask], order='C')
-    data = np.asarray(func_array.data[unmatched_mask], order='C')
-
-    return [coords], [data]
-
-
 def _get_nary_broadcast_shape(*shapes):
     """
     Broadcast any number of shapes to a result shape.
@@ -376,7 +148,7 @@ def _get_broadcast_shape(shape1, shape2, is_result=False):
         raise ValueError('operands could not be broadcast together with shapes %s, %s' %
                          (shape1, shape2))
 
-    result_shape = tuple(max(l1, l2) for l1, l2 in
+    result_shape = tuple(l1 if l1 != 1 else l2 for l1, l2 in
                          zip_longest(shape1[::-1], shape2[::-1], fillvalue=1))[::-1]
 
     return result_shape
@@ -532,7 +304,7 @@ def _cartesian_product(*arrays):
     return out.reshape(cols, rows)
 
 
-def _get_matching_coords(coords, params, shape):
+def _get_matching_coords(coords, params):
     """
     Get the matching coords across a number of broadcast operands.
 
@@ -605,3 +377,290 @@ def broadcast_to(x, shape):
 
     return COO(coords, data, shape=result_shape, has_duplicates=False,
                sorted=sorted, fill_value=x.fill_value)
+
+
+class _Elemwise(object):
+    def __init__(self, func, *args, **kwargs):
+        """
+        Initialize the element-wise function calculator.
+
+        Parameters
+        ----------
+        func : types.Callable
+            The function to compute
+        args : tuple[Union[SparseArray, ndarray, scipy.sparse.spmatrix]]
+            The arguments to compute the function on.
+        kwargs : dict
+            Extra arguments to pass to the function.
+        """
+
+        from .core import COO
+        from ..sparse_array import SparseArray
+
+        processed_args = []
+
+        for arg in args:
+            if isinstance(arg, scipy.sparse.spmatrix):
+                processed_args.append(COO.from_scipy_sparse(arg))
+            elif isscalar(arg) or isinstance(arg, np.ndarray):
+                # Faster and more reliable to pass ()-shaped ndarrays as scalars.
+                processed_args.append(np.asarray(arg))
+            elif isinstance(arg, SparseArray) and not isinstance(arg, COO):
+                processed_args.append(COO(arg))
+            elif not isinstance(arg, COO):
+                self.args = None
+                return
+            else:
+                processed_args.append(arg)
+
+        self.args = tuple(processed_args)
+        self.func = func
+        self.kwargs = kwargs
+        self.cache = {}
+
+        self._get_fill_value()
+        self._check_broadcast()
+
+    def get_result(self):
+        from .core import COO
+        if self.args is None:
+            return NotImplemented
+
+        if any(s == 0 for s in self.shape):
+            data = np.empty((0,), dtype=self.fill_value.dtype)
+            coords = np.empty((0, len(self.shape)), dtype=np.intp)
+            return COO(coords, data, shape=self.shape, has_duplicates=False, fill_value=self.fill_value)
+
+        data_list = []
+        coords_list = []
+
+        for mask in itertools.product(*[[True, False] if isinstance(arg, COO)
+                                        else [None] for arg in self.args]):
+            if not any(mask):
+                continue
+
+            r = self._get_func_coords_data(mask)
+
+            if r is not None:
+                coords_list.append(r[0])
+                data_list.append(r[1])
+
+        # Concatenate matches and mismatches
+        data = np.concatenate(data_list) if len(data_list) else np.empty((0,), dtype=self.fill_value.dtype)
+        coords = np.concatenate(coords_list, axis=1) if len(coords_list) else \
+            np.empty((0, len(self.shape)), dtype=np.intp)
+
+        return COO(coords, data, shape=self.shape, has_duplicates=False, fill_value=self.fill_value)
+
+    def _get_fill_value(self):
+        """
+        A function that finds and returns the fill-value.
+
+        Raises
+        ------
+        ValueError
+            If the fill-value is inconsistent.
+        """
+        from .core import COO
+
+        zero_args = tuple(arg.fill_value[...] if isinstance(arg, COO) else arg for arg in self.args)
+        fill_value_array = self.func(*zero_args, **self.kwargs)
+
+        try:
+            fill_value = fill_value_array[(0,) * fill_value_array.ndim]
+        except IndexError:
+            zero_args = tuple(
+                arg.fill_value if isinstance(arg, COO) else _zero_of_dtype(arg.dtype) for arg in self.args)
+            fill_value = self.func(*zero_args, **self.kwargs)[()]
+
+        if not equivalent(fill_value, fill_value_array).all():
+            raise ValueError('Inconsistent fill-values in the result array: operating on the ndarray with'
+                             'fill-values produces inconsistent results.')
+
+        self.fill_value = fill_value
+
+    def _check_broadcast(self):
+        """
+        Checks if adding the ndarrays changes the broadcast shape.
+
+        Raises
+        ------
+        ValueError
+            If the check fails.
+        """
+        from .core import COO
+        full_shape = _get_nary_broadcast_shape(*tuple(arg.shape for arg in self.args))
+        non_ndarray_shape = _get_nary_broadcast_shape(
+            *tuple(arg.shape for arg in self.args if isinstance(arg, COO))
+        )
+
+        if full_shape != non_ndarray_shape:
+            raise ValueError('All ndarrays must be broadcastable to the shape without ndarrays {}'
+                             .format(non_ndarray_shape))
+
+        self.shape = full_shape
+
+    def _get_func_coords_data(self, mask):
+        """
+        Gets the coords/data for a certain mask
+
+        Parameters
+        ----------
+        mask : tuple[Union[bool, NoneType]]
+            The mask determining whether to match or unmatch.
+
+        Returns
+        -------
+        None or tuple
+            The coords/data tuple for the given mask.
+        """
+        from .core import COO
+
+        matched_args = [arg for arg, m in zip(self.args, mask) if m is not None and m]
+        unmatched_args = [arg for arg, m in zip(self.args, mask) if m is not None and not m]
+        ndarray_args = [arg for arg, m in zip(self.args, mask) if m is None]
+
+        matched_broadcast_shape = _get_nary_broadcast_shape(
+            *tuple(arg.shape for arg in itertools.chain(matched_args, ndarray_args))
+        )
+
+        matched_arrays = self._match_coo(*matched_args,
+                                         cache=self.cache,
+                                         broadcast_shape=matched_broadcast_shape)
+
+        func_args = []
+
+        m_arg = 0
+        for arg, m in zip(self.args, mask):
+            if m is None:
+                func_args.append(np.broadcast_to(arg, matched_broadcast_shape)[tuple(matched_arrays[0].coords)])
+                continue
+
+            if m:
+                func_args.append(matched_arrays[m_arg].data)
+                m_arg += 1
+            else:
+                func_args.append(arg.fill_value)
+
+        func_data = self.func(*func_args, **self.kwargs)
+        unmatched_mask = ~equivalent(func_data, self.fill_value)
+
+        if not unmatched_mask.any():
+            return None
+
+        func_coords = matched_arrays[0].coords[:, unmatched_mask]
+        func_data = func_data[unmatched_mask]
+
+        if matched_arrays[0].shape != self.shape:
+            params = _get_broadcast_parameters(matched_arrays[0].shape, self.shape)
+            func_coords, func_data = _get_expanded_coords_data(func_coords, func_data, params, self.shape)
+
+        if all(m is None or m for m in mask):
+            return func_coords, func_data
+
+        # Not really sorted but we need the sortedness.
+        func_array = COO(func_coords, func_data, self.shape, has_duplicates=False, sorted=True)
+
+        unmatched_mask = np.ones(func_array.nnz, dtype=np.bool)
+
+        for arg in unmatched_args:
+            matched_idx = self._match_coo(func_array, arg, return_midx=True)[0]
+            unmatched_mask[matched_idx] = False
+
+        coords = np.asarray(func_array.coords[:, unmatched_mask], order='C')
+        data = np.asarray(func_array.data[unmatched_mask], order='C')
+
+        return coords, data
+
+    @staticmethod
+    def _match_coo(*args, **kwargs):
+        """
+        Matches the coordinates for any number of input :obj:`COO` arrays.
+        Equivalent to "sparse" broadcasting for all arrays.
+
+        Parameters
+        ----------
+        args : Tuple[COO]
+            The input :obj:`COO` arrays.
+        return_midx : bool
+            Whether to return matched indices or matched arrays. Matching
+            only supported for two arrays. ``False`` by default.
+        cache : dict
+            Cache of things already matched. No cache by default.
+
+        Returns
+        -------
+        matched_idx : List[ndarray]
+            The indices of matched elements in the original arrays. Only returned if
+            ``return_midx`` is ``True``.
+        matched_arrays : List[COO]
+            The expanded, matched :obj:`COO` objects. Only returned if
+            ``return_midx`` is ``False``.
+        """
+        from .core import COO
+        from .common import linear_loc
+
+        cache = kwargs.pop('cache', None)
+        return_midx = kwargs.pop('return_midx', False)
+        broadcast_shape = kwargs.pop('broadcast_shape', None)
+
+        if kwargs:
+            raise ValueError('Unknown kwargs: {}'.format(kwargs.keys()))
+
+        if return_midx and (len(args) != 2 or cache is not None):
+            raise NotImplementedError('Matching indices only supported for two args, and no cache.')
+
+        matched_arrays = [args[0]]
+        cache_key = [id(args[0])]
+        for arg2 in args[1:]:
+            cache_key.append(id(arg2))
+            key = tuple(cache_key)
+            if cache is not None and key in cache:
+                matched_arrays = cache[key]
+                continue
+
+            cargs = [matched_arrays[0], arg2]
+            current_shape = _get_broadcast_shape(matched_arrays[0].shape, arg2.shape)
+            params = [_get_broadcast_parameters(arg.shape, current_shape) for arg in cargs]
+            reduced_params = [all(p) for p in zip(*params)]
+            reduced_shape = _get_reduced_shape(arg2.shape,
+                                               reduced_params[-arg2.ndim:])
+
+            reduced_coords = [_get_reduced_coords(arg.coords, reduced_params[-arg.ndim:])
+                              for arg in cargs]
+
+            linear = [linear_loc(rc, reduced_shape) for rc in reduced_coords]
+            sorted_idx = [np.argsort(idx) for idx in linear]
+            linear = [idx[s] for idx, s in zip(linear, sorted_idx)]
+            matched_idx = _match_arrays(*linear)
+
+            if return_midx:
+                matched_idx = [sidx[midx] for sidx, midx in zip(sorted_idx, matched_idx)]
+                return matched_idx
+
+            coords = [arg.coords[:, s] for arg, s in zip(cargs, sorted_idx)]
+            mcoords = [c[:, idx] for c, idx in zip(coords, matched_idx)]
+            mcoords = _get_matching_coords(mcoords, params)
+            mdata = [arg.data[sorted_idx[0]][matched_idx[0]] for arg in matched_arrays]
+            mdata.append(arg2.data[sorted_idx[1]][matched_idx[1]])
+            # The coords aren't truly sorted, but we don't need them, so it's
+            # best to avoid the extra cost.
+            matched_arrays = [
+                COO(mcoords, md, shape=current_shape, sorted=True, has_duplicates=False)
+                for md in mdata]
+
+            if cache is not None:
+                cache[key] = matched_arrays
+
+        if broadcast_shape is not None and matched_arrays[0].shape != broadcast_shape:
+            params = _get_broadcast_parameters(matched_arrays[0].shape, broadcast_shape)
+            coords, idx = _get_expanded_coords_data(
+                matched_arrays[0].coords, np.arange(matched_arrays[0].nnz), params, broadcast_shape
+            )
+
+            matched_arrays = [
+                COO(coords, arr.data[idx], shape=broadcast_shape, sorted=True, has_duplicates=False)
+                for arr in matched_arrays
+            ]
+
+        return matched_arrays
diff --git a/sparse/utils.py b/sparse/utils.py
index f7602ea..e759237 100644
--- a/sparse/utils.py
+++ b/sparse/utils.py
@@ -165,36 +165,6 @@ def isscalar(x):
     return not isinstance(x, SparseArray) and np.isscalar(x)
 
 
-class PositinalArgumentPartial(object):
-    def __init__(self, func, pos, posargs):
-        self.pos = list(pos)
-        self.posargs = list(posargs)
-        self.func = func
-
-        self.n = len(pos)
-
-        self.__doc__ = func.__doc__
-
-    def __call__(self, *args, **kwargs):
-        j = 0
-        totargs = []
-
-        for i in range(len(args) + self.n):
-            if j >= self.n or i != self.pos[j]:
-                totargs.append(args[i - j])
-            else:
-                totargs.append(self.posargs[j])
-                j += 1
-
-        return self.func(*totargs, **kwargs)
-
-    def __str__(self):
-        return str(self.func)
-
-    def __repr__(self):
-        return repr(self.func)
-
-
 def random_value_array(value, fraction):
     def replace_values(n):
         i = int(n * fraction)

Allow ndarray in elemwise again
I was considering allowing `ndarray` under `elemwise` again, provided that `f(ndarrays, zeros_in_place_of_COO)` is all-zero.

Upsides:

- No conversion required
- No matching/sorting required for the `ndarray` inputs at all. This makes it significantly faster for mixed sparse-dense `elemwise`.

Downsides:

- We'll have to broadcast all `ndarrays` against each other to actually test for densification. This could be huge. Or we can skip this step and risk wrong results.
  - Not so bad considering in almost all use-cases, the `ndarrays` will be tiny compared to `COO`.
- Puts a slight (but not huge) roadblock for arbitrary fill-values.
diff --git a/sparse/tests/test_coo.py b/sparse/tests/test_coo.py
index fdc474e..e692cb2 100644
--- a/sparse/tests/test_coo.py
+++ b/sparse/tests/test_coo.py
@@ -293,6 +293,59 @@ def test_elemwise_inplace(func):
     assert_eq(x, s)
 
 
+def test_elemwise_mixed():
+    s1 = sparse.random((2, 3, 4), density=0.5)
+    x2 = np.random.rand(4)
+
+    x1 = s1.todense()
+
+    assert_eq(s1 * x2, x1 * x2)
+
+
+def test_elemwise_mixed_empty():
+    s1 = sparse.random((2, 0, 4), density=0.5)
+    x2 = np.random.rand(2, 0, 4)
+
+    x1 = s1.todense()
+
+    assert_eq(s1 * x2, x1 * x2)
+
+
+def test_ndarray_bigger_shape():
+    s1 = sparse.random((2, 3, 4), density=0.5)
+    x2 = np.random.rand(5, 1, 1, 1)
+
+    with pytest.raises(ValueError):
+        s1 * x2
+
+
+def test_elemwise_unsupported():
+    class A():
+        pass
+
+    s1 = sparse.random((2, 3, 4), density=0.5)
+    x2 = A()
+
+    with pytest.raises(TypeError):
+        s1 + x2
+
+    assert sparse.elemwise(operator.add, s1, x2) is NotImplemented
+
+
+def test_elemwise_mixed_broadcast():
+    s1 = sparse.random((2, 3, 4), density=0.5)
+    s2 = sparse.random(4, density=0.5)
+    x3 = np.random.rand(3, 4)
+
+    x1 = s1.todense()
+    x2 = s2.todense()
+
+    def func(x1, x2, x3):
+        return x1 * x2 * x3
+
+    assert_eq(sparse.elemwise(func, s1, s2, x3), func(x1, x2, x3))
+
+
 @pytest.mark.parametrize('func', [
     operator.mul, operator.add, operator.sub, operator.gt,
     operator.lt, operator.ne
@@ -486,7 +539,7 @@ def test_trinary_broadcasting_pathological(shapes, func, value, fraction):
 
 
 def test_sparse_broadcasting(monkeypatch):
-    orig_unmatch_coo = sparse.coo.umath._unmatch_coo
+    orig_unmatch_coo = sparse.coo.umath._Elemwise._get_func_coords_data
 
     state = {'num_matches': 0}
 
@@ -495,10 +548,11 @@ def test_sparse_broadcasting(monkeypatch):
 
     def mock_unmatch_coo(*args, **kwargs):
         result = orig_unmatch_coo(*args, **kwargs)
-        state['num_matches'] += len(result[0])
+        if result is not None:
+            state['num_matches'] += 1
         return result
 
-    monkeypatch.setattr(sparse.coo.umath, '_unmatch_coo', mock_unmatch_coo)
+    monkeypatch.setattr(sparse.coo.umath._Elemwise, '_get_func_coords_data', mock_unmatch_coo)
 
     xs * ys
 
@@ -507,7 +561,7 @@ def test_sparse_broadcasting(monkeypatch):
 
 
 def test_dense_broadcasting(monkeypatch):
-    orig_unmatch_coo = sparse.coo.umath._unmatch_coo
+    orig_unmatch_coo = sparse.coo.umath._Elemwise._get_func_coords_data
 
     state = {'num_matches': 0}
 
@@ -516,10 +570,11 @@ def test_dense_broadcasting(monkeypatch):
 
     def mock_unmatch_coo(*args, **kwargs):
         result = orig_unmatch_coo(*args, **kwargs)
-        state['num_matches'] += len(result[0])
+        if result is not None:
+            state['num_matches'] += 1
         return result
 
-    monkeypatch.setattr(sparse.coo.umath, '_unmatch_coo', mock_unmatch_coo)
+    monkeypatch.setattr(sparse.coo.umath._Elemwise, '_get_func_coords_data', mock_unmatch_coo)
 
     xs + ys
 
@@ -545,7 +600,7 @@ def test_ndarray_densification_fails():
     xs = sparse.random((3, 4), density=0.5)
     y = np.random.rand(3, 4)
 
-    with pytest.raises(TypeError):
+    with pytest.raises(ValueError):
         xs + y
 
 
@@ -553,7 +608,7 @@ def test_elemwise_noargs():
     def func():
         return np.float_(5.0)
 
-    assert sparse.elemwise(func) == func()
+    assert_eq(sparse.elemwise(func), func())
 
 
 @pytest.mark.parametrize('func', [

pip install -e .[all]
parse_log_pytest
requirements.txt
pytest pytest-flake8 pytest-cov
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
asv==0.5.1
attrs==22.2.0
Babel==2.11.0
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
distlib==0.3.9
docutils==0.17.1
filelock==3.4.1
flake8==5.0.4
idna==3.10
imagesize==1.4.1
importlib-metadata==4.2.0
importlib-resources==5.4.0
iniconfig==1.1.1
Jinja2==3.0.3
llvmlite==0.36.0
MarkupSafe==2.0.1
mccabe==0.7.0
numba==0.53.1
numpy==1.19.5
packaging==21.3
platformdirs==2.4.0
pluggy==1.0.0
py==1.11.0
pycodestyle==2.9.1
pyflakes==2.5.0
Pygments==2.14.0
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
pytest-flake8==1.1.1
pytz==2025.2
releases==2.1.1
requests==2.27.1
scipy==1.5.4
semantic-version==2.6.0
six==1.17.0
snowballstemmer==2.2.0
-e git+https://github.com/pydata/sparse.git@b03b6b9a480a10a3cf59d7994292b9c5d3015cd5#egg=sparse
Sphinx==4.3.2
sphinx-rtd-theme==1.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
toml==0.10.2
tomli==1.2.3
tox==3.28.0
typing_extensions==4.1.1
urllib3==1.26.20
virtualenv==20.16.2
zipp==3.6.0

name: sparse
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - asv==0.5.1
      - attrs==22.2.0
      - babel==2.11.0
      - charset-normalizer==2.0.12
      - coverage==6.2
      - distlib==0.3.9
      - docutils==0.17.1
      - filelock==3.4.1
      - flake8==5.0.4
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.2.0
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - llvmlite==0.36.0
      - markupsafe==2.0.1
      - mccabe==0.7.0
      - numba==0.53.1
      - numpy==1.19.5
      - packaging==21.3
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - py==1.11.0
      - pycodestyle==2.9.1
      - pyflakes==2.5.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - pytest-flake8==1.1.1
      - pytz==2025.2
      - releases==2.1.1
      - requests==2.27.1
      - scipy==1.5.4
      - semantic-version==2.6.0
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==4.3.2
      - sphinx-rtd-theme==1.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jquery==4.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - toml==0.10.2
      - tomli==1.2.3
      - tox==3.28.0
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - virtualenv==20.16.2
      - zipp==3.6.0
prefix: /opt/conda/envs/sparse

sparse/tests/test_coo.py::test_elemwise_mixed sparse/tests/test_coo.py::test_elemwise_mixed_empty sparse/tests/test_coo.py::test_ndarray_bigger_shape sparse/tests/test_coo.py::test_elemwise_mixed_broadcast sparse/tests/test_coo.py::test_sparse_broadcasting sparse/tests/test_coo.py::test_dense_broadcasting sparse/tests/test_coo.py::test_ndarray_densification_fails sparse/tests/test_dok.py::test_setitem[shape0-index0-0.20334826085619861] sparse/tests/test_dok.py::test_setitem[shape1-index1-0.6453249644526395] sparse/tests/test_dok.py::test_setitem[shape3-1-0.4205356283126368] sparse/tests/test_dok.py::test_setitem[shape4-index4-0.9052351839659999] sparse/tests/test_dok.py::test_setitem[shape5-index5-0.3489304021939277] sparse/tests/test_dok.py::test_setitem[shape9-index9-0.7722599625576393] sparse/tests/test_dok.py::test_setitem[shape11-index11-0.14183046036354652] sparse/tests/test_dok.py::test_setitem[shape13-index13-0.014592003691852984]
sparse/__init__.py::flake-8::FLAKE8 sparse/_version.py::flake-8::FLAKE8 sparse/compatibility.py::flake-8::FLAKE8 sparse/dok.py::flake-8::FLAKE8 sparse/io.py::flake-8::FLAKE8 sparse/slicing.py::flake-8::FLAKE8 sparse/sparse_array.py::flake-8::FLAKE8 sparse/utils.py::flake-8::FLAKE8 sparse/coo/__init__.py::flake-8::FLAKE8 sparse/coo/common.py::flake-8::FLAKE8 sparse/coo/core.py::flake-8::FLAKE8 sparse/coo/indexing.py::flake-8::FLAKE8 sparse/coo/umath.py::flake-8::FLAKE8 sparse/tests/test_coo.py::flake-8::FLAKE8 sparse/tests/test_coo.py::test_op_scipy_sparse_left[func2] sparse/tests/test_coo.py::test_op_scipy_sparse_left[func3] sparse/tests/test_coo.py::test_op_scipy_sparse_left[func4] sparse/tests/test_coo.py::test_op_scipy_sparse_left[func5] sparse/tests/test_dok.py::flake-8::FLAKE8 sparse/tests/test_io.py::flake-8::FLAKE8
sparse/dok.py::sparse.dok.DOK sparse/dok.py::sparse.dok.DOK.from_coo sparse/dok.py::sparse.dok.DOK.from_numpy sparse/dok.py::sparse.dok.DOK.nnz sparse/dok.py::sparse.dok.DOK.to_coo sparse/dok.py::sparse.dok.DOK.todense sparse/io.py::sparse.io.save_npz sparse/slicing.py::sparse.slicing.check_index sparse/slicing.py::sparse.slicing.clip_slice sparse/slicing.py::sparse.slicing.normalize_index sparse/slicing.py::sparse.slicing.posify_index sparse/slicing.py::sparse.slicing.replace_ellipsis sparse/slicing.py::sparse.slicing.replace_none sparse/slicing.py::sparse.slicing.sanitize_index sparse/sparse_array.py::sparse.sparse_array.SparseArray.density sparse/sparse_array.py::sparse.sparse_array.SparseArray.ndim sparse/sparse_array.py::sparse.sparse_array.SparseArray.nnz sparse/sparse_array.py::sparse.sparse_array.SparseArray.size sparse/utils.py::sparse.utils.check_consistent_fill_value sparse/utils.py::sparse.utils.check_zero_fill_value sparse/utils.py::sparse.utils.equivalent sparse/utils.py::sparse.utils.random sparse/coo/core.py::sparse.coo.core.COO sparse/coo/core.py::sparse.coo.core.COO.T sparse/coo/core.py::sparse.coo.core.COO.__len__ sparse/coo/core.py::sparse.coo.core.COO._sort_indices sparse/coo/core.py::sparse.coo.core.COO._sum_duplicates sparse/coo/core.py::sparse.coo.core.COO.all sparse/coo/core.py::sparse.coo.core.COO.any sparse/coo/core.py::sparse.coo.core.COO.dot sparse/coo/core.py::sparse.coo.core.COO.dtype sparse/coo/core.py::sparse.coo.core.COO.from_iter sparse/coo/core.py::sparse.coo.core.COO.from_numpy sparse/coo/core.py::sparse.coo.core.COO.from_scipy_sparse sparse/coo/core.py::sparse.coo.core.COO.linear_loc sparse/coo/core.py::sparse.coo.core.COO.max sparse/coo/core.py::sparse.coo.core.COO.maybe_densify sparse/coo/core.py::sparse.coo.core.COO.min sparse/coo/core.py::sparse.coo.core.COO.nbytes sparse/coo/core.py::sparse.coo.core.COO.nnz sparse/coo/core.py::sparse.coo.core.COO.nonzero sparse/coo/core.py::sparse.coo.core.COO.prod sparse/coo/core.py::sparse.coo.core.COO.reduce sparse/coo/core.py::sparse.coo.core.COO.reshape sparse/coo/core.py::sparse.coo.core.COO.sum sparse/coo/core.py::sparse.coo.core.COO.todense sparse/coo/core.py::sparse.coo.core.COO.transpose sparse/coo/indexing.py::sparse.coo.indexing._compute_mask sparse/coo/indexing.py::sparse.coo.indexing._filter_pairs sparse/coo/indexing.py::sparse.coo.indexing._get_mask_pairs sparse/coo/indexing.py::sparse.coo.indexing._get_slice_len sparse/coo/indexing.py::sparse.coo.indexing._ind_ar_from_indices sparse/coo/indexing.py::sparse.coo.indexing._join_adjacent_pairs sparse/coo/indexing.py::sparse.coo.indexing._prune_indices sparse/tests/test_coo.py::test_reductions[True-None-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[True-None-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[True-None-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[True-None-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[True-None-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[True-0-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[True-0-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[True-0-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[True-0-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[True-0-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[True-1-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[True-1-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[True-1-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[True-1-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[True-1-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[True-2-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[True-2-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[True-2-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[True-2-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[True-2-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[True-axis4-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[True-axis4-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[True-axis4-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[True-axis4-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[True-axis4-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[True--3-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[True--3-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[True--3-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[True--3-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[True--3-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[True-axis6-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[True-axis6-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[True-axis6-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[True-axis6-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[True-axis6-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[False-None-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[False-None-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[False-None-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[False-None-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[False-None-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[False-0-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[False-0-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[False-0-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[False-0-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[False-0-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[False-1-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[False-1-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[False-1-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[False-1-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[False-1-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[False-2-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[False-2-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[False-2-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[False-2-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[False-2-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[False-axis4-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[False-axis4-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[False-axis4-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[False-axis4-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[False-axis4-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[False--3-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[False--3-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[False--3-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[False--3-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[False--3-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions[False-axis6-max-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions[False-axis6-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions[False-axis6-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_reductions[False-axis6-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_reductions[False-axis6-min-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_reductions_bool[True-None-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[True-None-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[True-0-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[True-0-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[True-1-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[True-1-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[True-2-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[True-2-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[True-axis4-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[True-axis4-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[True--3-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[True--3-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[True-axis6-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[True-axis6-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[False-None-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[False-None-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[False-0-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[False-0-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[False-1-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[False-1-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[False-2-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[False-2-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[False-axis4-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[False-axis4-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[False--3-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[False--3-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_reductions_bool[False-axis6-any-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_reductions_bool[False-axis6-all-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True-None-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[True-None-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True-None-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[True-None-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[True-None-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[True-0-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[True-0-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True-0-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[True-0-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[True-0-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[True-1-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[True-1-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True-1-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[True-1-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[True-1-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[True-2-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[True-2-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True-2-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[True-2-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[True-2-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis4-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis4-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis4-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis4-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis4-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[True--1-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[True--1-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True--1-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[True--1-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[True--1-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis6-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis6-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis6-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis6-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[True-axis6-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[False-None-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[False-None-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[False-None-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[False-None-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[False-None-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[False-0-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[False-0-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[False-0-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[False-0-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[False-0-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[False-1-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[False-1-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[False-1-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[False-1-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[False-1-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[False-2-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[False-2-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[False-2-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[False-2-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[False-2-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis4-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis4-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis4-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis4-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis4-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[False--1-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[False--1-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[False--1-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[False--1-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[False--1-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis6-amax-kwargs0-eqkwargs0] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis6-sum-kwargs1-eqkwargs1] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis6-sum-kwargs2-eqkwargs2] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis6-prod-kwargs3-eqkwargs3] sparse/tests/test_coo.py::test_ufunc_reductions[False-axis6-amin-kwargs4-eqkwargs4] sparse/tests/test_coo.py::test_ufunc_reductions_kwargs[amax-kwargs0] sparse/tests/test_coo.py::test_ufunc_reductions_kwargs[sum-kwargs1] sparse/tests/test_coo.py::test_ufunc_reductions_kwargs[prod-kwargs2] sparse/tests/test_coo.py::test_ufunc_reductions_kwargs[reduce-kwargs3] sparse/tests/test_coo.py::test_ufunc_reductions_kwargs[reduce-kwargs4] sparse/tests/test_coo.py::test_ufunc_reductions_kwargs[reduce-kwargs5] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-None-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-None-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-None-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-None-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-0-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-0-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-0-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-0-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-1-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-1-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-1-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.25-False-1-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-None-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-None-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-None-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-None-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-0-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-0-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-0-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-0-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-1-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-1-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-1-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.5-False-1-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-None-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-None-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-None-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-None-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-0-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-0-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-0-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-0-nanmin] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-1-nansum] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-1-nanprod] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-1-nanmax] sparse/tests/test_coo.py::test_nan_reductions[0.75-False-1-nanmin] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-None-nansum] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-None-nanprod] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-None-nanmax] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-None-nanmin] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-0-nansum] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-0-nanprod] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-0-nanmax] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-0-nanmin] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-1-nansum] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-1-nanprod] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-1-nanmax] sparse/tests/test_coo.py::test_nan_reductions[1.0-False-1-nanmin] sparse/tests/test_coo.py::test_all_nan_reduction_warning[None-nanmax] sparse/tests/test_coo.py::test_all_nan_reduction_warning[None-nanmin] sparse/tests/test_coo.py::test_all_nan_reduction_warning[0-nanmax] sparse/tests/test_coo.py::test_all_nan_reduction_warning[0-nanmin] sparse/tests/test_coo.py::test_all_nan_reduction_warning[1-nanmax] sparse/tests/test_coo.py::test_all_nan_reduction_warning[1-nanmin] sparse/tests/test_coo.py::test_transpose[None] sparse/tests/test_coo.py::test_transpose[axis1] sparse/tests/test_coo.py::test_transpose[axis2] sparse/tests/test_coo.py::test_transpose[axis3] sparse/tests/test_coo.py::test_transpose[axis4] sparse/tests/test_coo.py::test_transpose[axis5] sparse/tests/test_coo.py::test_transpose[axis6] sparse/tests/test_coo.py::test_transpose_error[axis0] sparse/tests/test_coo.py::test_transpose_error[axis1] sparse/tests/test_coo.py::test_transpose_error[axis2] sparse/tests/test_coo.py::test_transpose_error[axis3] sparse/tests/test_coo.py::test_transpose_error[axis4] sparse/tests/test_coo.py::test_transpose_error[axis5] sparse/tests/test_coo.py::test_transpose_error[0.3] sparse/tests/test_coo.py::test_transpose_error[axis7] sparse/tests/test_coo.py::test_reshape[a0-b0] sparse/tests/test_coo.py::test_reshape[a1-b1] sparse/tests/test_coo.py::test_reshape[a2-b2] sparse/tests/test_coo.py::test_reshape[a3-b3] sparse/tests/test_coo.py::test_reshape[a4-b4] sparse/tests/test_coo.py::test_reshape[a5-b5] sparse/tests/test_coo.py::test_reshape[a6-b6] sparse/tests/test_coo.py::test_reshape[a7-b7] sparse/tests/test_coo.py::test_reshape[a8-b8] sparse/tests/test_coo.py::test_reshape[a9-b9] sparse/tests/test_coo.py::test_large_reshape sparse/tests/test_coo.py::test_reshape_same sparse/tests/test_coo.py::test_to_scipy_sparse sparse/tests/test_coo.py::test_tensordot[a_shape0-b_shape0-axes0] sparse/tests/test_coo.py::test_tensordot[a_shape1-b_shape1-axes1] sparse/tests/test_coo.py::test_tensordot[a_shape2-b_shape2-axes2] sparse/tests/test_coo.py::test_tensordot[a_shape3-b_shape3-axes3] sparse/tests/test_coo.py::test_tensordot[a_shape4-b_shape4-axes4] sparse/tests/test_coo.py::test_tensordot[a_shape5-b_shape5-axes5] sparse/tests/test_coo.py::test_tensordot[a_shape6-b_shape6-axes6] sparse/tests/test_coo.py::test_tensordot[a_shape7-b_shape7-axes7] sparse/tests/test_coo.py::test_tensordot[a_shape8-b_shape8-axes8] sparse/tests/test_coo.py::test_tensordot[a_shape9-b_shape9-0] sparse/tests/test_coo.py::test_dot[a_shape0-b_shape0] sparse/tests/test_coo.py::test_dot[a_shape1-b_shape1] sparse/tests/test_coo.py::test_dot[a_shape2-b_shape2] sparse/tests/test_coo.py::test_dot[a_shape3-b_shape3] sparse/tests/test_coo.py::test_dot[a_shape4-b_shape4] sparse/tests/test_coo.py::test_elemwise[expm1] sparse/tests/test_coo.py::test_elemwise[log1p] sparse/tests/test_coo.py::test_elemwise[sin] sparse/tests/test_coo.py::test_elemwise[tan] sparse/tests/test_coo.py::test_elemwise[sinh] sparse/tests/test_coo.py::test_elemwise[tanh] sparse/tests/test_coo.py::test_elemwise[floor] sparse/tests/test_coo.py::test_elemwise[ceil] sparse/tests/test_coo.py::test_elemwise[sqrt] sparse/tests/test_coo.py::test_elemwise[conjugate0] sparse/tests/test_coo.py::test_elemwise[round_] sparse/tests/test_coo.py::test_elemwise[rint] sparse/tests/test_coo.py::test_elemwise[<lambda>0] sparse/tests/test_coo.py::test_elemwise[conjugate1] sparse/tests/test_coo.py::test_elemwise[conjugate2] sparse/tests/test_coo.py::test_elemwise[<lambda>1] sparse/tests/test_coo.py::test_elemwise[abs] sparse/tests/test_coo.py::test_elemwise_inplace[expm1] sparse/tests/test_coo.py::test_elemwise_inplace[log1p] sparse/tests/test_coo.py::test_elemwise_inplace[sin] sparse/tests/test_coo.py::test_elemwise_inplace[tan] sparse/tests/test_coo.py::test_elemwise_inplace[sinh] sparse/tests/test_coo.py::test_elemwise_inplace[tanh] sparse/tests/test_coo.py::test_elemwise_inplace[floor] sparse/tests/test_coo.py::test_elemwise_inplace[ceil] sparse/tests/test_coo.py::test_elemwise_inplace[sqrt] sparse/tests/test_coo.py::test_elemwise_inplace[conjugate0] sparse/tests/test_coo.py::test_elemwise_inplace[round_] sparse/tests/test_coo.py::test_elemwise_inplace[rint] sparse/tests/test_coo.py::test_elemwise_inplace[conjugate1] sparse/tests/test_coo.py::test_elemwise_inplace[conjugate2] sparse/tests/test_coo.py::test_elemwise_inplace[<lambda>] sparse/tests/test_coo.py::test_elemwise_unsupported sparse/tests/test_coo.py::test_elemwise_binary[shape0-mul] sparse/tests/test_coo.py::test_elemwise_binary[shape0-add] sparse/tests/test_coo.py::test_elemwise_binary[shape0-sub] sparse/tests/test_coo.py::test_elemwise_binary[shape0-gt] sparse/tests/test_coo.py::test_elemwise_binary[shape0-lt] sparse/tests/test_coo.py::test_elemwise_binary[shape0-ne] sparse/tests/test_coo.py::test_elemwise_binary[shape1-mul] sparse/tests/test_coo.py::test_elemwise_binary[shape1-add] sparse/tests/test_coo.py::test_elemwise_binary[shape1-sub] sparse/tests/test_coo.py::test_elemwise_binary[shape1-gt] sparse/tests/test_coo.py::test_elemwise_binary[shape1-lt] sparse/tests/test_coo.py::test_elemwise_binary[shape1-ne] sparse/tests/test_coo.py::test_elemwise_binary[shape2-mul] sparse/tests/test_coo.py::test_elemwise_binary[shape2-add] sparse/tests/test_coo.py::test_elemwise_binary[shape2-sub] sparse/tests/test_coo.py::test_elemwise_binary[shape2-gt] sparse/tests/test_coo.py::test_elemwise_binary[shape2-lt] sparse/tests/test_coo.py::test_elemwise_binary[shape2-ne] sparse/tests/test_coo.py::test_elemwise_binary[shape3-mul] sparse/tests/test_coo.py::test_elemwise_binary[shape3-add] sparse/tests/test_coo.py::test_elemwise_binary[shape3-sub] sparse/tests/test_coo.py::test_elemwise_binary[shape3-gt] sparse/tests/test_coo.py::test_elemwise_binary[shape3-lt] sparse/tests/test_coo.py::test_elemwise_binary[shape3-ne] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape0-imul] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape0-iadd] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape0-isub] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape1-imul] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape1-iadd] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape1-isub] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape2-imul] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape2-iadd] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape2-isub] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape3-imul] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape3-iadd] sparse/tests/test_coo.py::test_elemwise_binary_inplace[shape3-isub] sparse/tests/test_coo.py::test_elemwise_trinary[shape0-<lambda>0] sparse/tests/test_coo.py::test_elemwise_trinary[shape0-<lambda>1] sparse/tests/test_coo.py::test_elemwise_trinary[shape0-<lambda>2] sparse/tests/test_coo.py::test_elemwise_trinary[shape0-<lambda>3] sparse/tests/test_coo.py::test_elemwise_trinary[shape1-<lambda>0] sparse/tests/test_coo.py::test_elemwise_trinary[shape1-<lambda>1] sparse/tests/test_coo.py::test_elemwise_trinary[shape1-<lambda>2] sparse/tests/test_coo.py::test_elemwise_trinary[shape1-<lambda>3] sparse/tests/test_coo.py::test_elemwise_trinary[shape2-<lambda>0] sparse/tests/test_coo.py::test_elemwise_trinary[shape2-<lambda>1] sparse/tests/test_coo.py::test_elemwise_trinary[shape2-<lambda>2] sparse/tests/test_coo.py::test_elemwise_trinary[shape2-<lambda>3] sparse/tests/test_coo.py::test_elemwise_trinary[shape3-<lambda>0] sparse/tests/test_coo.py::test_elemwise_trinary[shape3-<lambda>1] sparse/tests/test_coo.py::test_elemwise_trinary[shape3-<lambda>2] sparse/tests/test_coo.py::test_elemwise_trinary[shape3-<lambda>3] sparse/tests/test_coo.py::test_binary_broadcasting[shape10-shape20-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape10-shape20-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape11-shape21-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape11-shape21-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape12-shape22-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape12-shape22-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape13-shape23-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape13-shape23-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape14-shape24-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape14-shape24-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape15-shape25-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape15-shape25-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape16-shape26-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape16-shape26-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape17-shape27-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape17-shape27-mul] sparse/tests/test_coo.py::test_binary_broadcasting[shape18-shape28-add] sparse/tests/test_coo.py::test_binary_broadcasting[shape18-shape28-mul] sparse/tests/test_coo.py::test_broadcast_to[shape10-shape20] sparse/tests/test_coo.py::test_broadcast_to[shape11-shape21] sparse/tests/test_coo.py::test_broadcast_to[shape12-shape22] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes0] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes1] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes2] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes3] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes4] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes5] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes6] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>0-shapes7] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes0] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes1] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes2] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes3] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes4] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes5] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes6] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>1-shapes7] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes0] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes1] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes2] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes3] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes4] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes5] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes6] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>2-shapes7] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes0] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes1] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes2] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes3] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes4] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes5] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes6] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>3-shapes7] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes0] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes1] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes2] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes3] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes4] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes5] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes6] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>4-shapes7] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes0] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes1] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes2] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes3] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes4] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes5] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes6] sparse/tests/test_coo.py::test_trinary_broadcasting[<lambda>5-shapes7] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-nan-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-nan-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-nan-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-nan-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25-inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25--inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25--inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25--inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.25--inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-nan-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-nan-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-nan-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-nan-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5-inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5--inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5--inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5--inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.5--inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-nan-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-nan-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-nan-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-nan-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75-inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75--inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75--inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75--inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[0.75--inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-nan-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-nan-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-nan-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-nan-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0-inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0--inf-shapes0-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0--inf-shapes1-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0--inf-shapes2-<lambda>] sparse/tests/test_coo.py::test_trinary_broadcasting_pathological[1.0--inf-shapes3-<lambda>] sparse/tests/test_coo.py::test_sparsearray_elemwise[coo] sparse/tests/test_coo.py::test_sparsearray_elemwise[dok] sparse/tests/test_coo.py::test_elemwise_noargs sparse/tests/test_coo.py::test_nonzero_outout_fv_ufunc[pow] sparse/tests/test_coo.py::test_nonzero_outout_fv_ufunc[truediv] sparse/tests/test_coo.py::test_nonzero_outout_fv_ufunc[floordiv] sparse/tests/test_coo.py::test_nonzero_outout_fv_ufunc[ge] sparse/tests/test_coo.py::test_nonzero_outout_fv_ufunc[le] sparse/tests/test_coo.py::test_nonzero_outout_fv_ufunc[eq] sparse/tests/test_coo.py::test_nonzero_outout_fv_ufunc[mod] sparse/tests/test_coo.py::test_elemwise_scalar[True-mul-5] sparse/tests/test_coo.py::test_elemwise_scalar[True-add-0] sparse/tests/test_coo.py::test_elemwise_scalar[True-sub-0] sparse/tests/test_coo.py::test_elemwise_scalar[True-pow-5] sparse/tests/test_coo.py::test_elemwise_scalar[True-truediv-3] sparse/tests/test_coo.py::test_elemwise_scalar[True-floordiv-4] sparse/tests/test_coo.py::test_elemwise_scalar[True-gt-5] sparse/tests/test_coo.py::test_elemwise_scalar[True-lt--5] sparse/tests/test_coo.py::test_elemwise_scalar[True-ne-0] sparse/tests/test_coo.py::test_elemwise_scalar[True-ge-5] sparse/tests/test_coo.py::test_elemwise_scalar[True-le--3] sparse/tests/test_coo.py::test_elemwise_scalar[True-eq-1] sparse/tests/test_coo.py::test_elemwise_scalar[True-mod-5] sparse/tests/test_coo.py::test_elemwise_scalar[False-mul-5] sparse/tests/test_coo.py::test_elemwise_scalar[False-add-0] sparse/tests/test_coo.py::test_elemwise_scalar[False-sub-0] sparse/tests/test_coo.py::test_elemwise_scalar[False-pow-5] sparse/tests/test_coo.py::test_elemwise_scalar[False-truediv-3] sparse/tests/test_coo.py::test_elemwise_scalar[False-floordiv-4] sparse/tests/test_coo.py::test_elemwise_scalar[False-gt-5] sparse/tests/test_coo.py::test_elemwise_scalar[False-lt--5] sparse/tests/test_coo.py::test_elemwise_scalar[False-ne-0] sparse/tests/test_coo.py::test_elemwise_scalar[False-ge-5] sparse/tests/test_coo.py::test_elemwise_scalar[False-le--3] sparse/tests/test_coo.py::test_elemwise_scalar[False-eq-1] sparse/tests/test_coo.py::test_elemwise_scalar[False-mod-5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-mul-5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-add-0] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-sub-0] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-gt--5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-lt-5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-ne-0] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-ge--5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-le-3] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[True-eq-1] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-mul-5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-add-0] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-sub-0] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-gt--5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-lt-5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-ne-0] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-ge--5] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-le-3] sparse/tests/test_coo.py::test_leftside_elemwise_scalar[False-eq-1] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[add-5] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[sub--5] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[pow--3] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[truediv-0] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[floordiv-0] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[gt--5] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[lt-5] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[ne-1] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[ge--3] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[le-3] sparse/tests/test_coo.py::test_scalar_output_nonzero_fv[eq-0] sparse/tests/test_coo.py::test_bitwise_binary[shape0-and_] sparse/tests/test_coo.py::test_bitwise_binary[shape0-or_] sparse/tests/test_coo.py::test_bitwise_binary[shape0-xor] sparse/tests/test_coo.py::test_bitwise_binary[shape1-and_] sparse/tests/test_coo.py::test_bitwise_binary[shape1-or_] sparse/tests/test_coo.py::test_bitwise_binary[shape1-xor] sparse/tests/test_coo.py::test_bitwise_binary[shape2-and_] sparse/tests/test_coo.py::test_bitwise_binary[shape2-or_] sparse/tests/test_coo.py::test_bitwise_binary[shape2-xor] sparse/tests/test_coo.py::test_bitwise_binary[shape3-and_] sparse/tests/test_coo.py::test_bitwise_binary[shape3-or_] sparse/tests/test_coo.py::test_bitwise_binary[shape3-xor] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape0-iand] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape0-ior] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape0-ixor] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape1-iand] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape1-ior] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape1-ixor] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape2-iand] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape2-ior] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape2-ixor] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape3-iand] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape3-ior] sparse/tests/test_coo.py::test_bitwise_binary_inplace[shape3-ixor] sparse/tests/test_coo.py::test_bitshift_binary[shape0-lshift] sparse/tests/test_coo.py::test_bitshift_binary[shape0-rshift] sparse/tests/test_coo.py::test_bitshift_binary[shape1-lshift] sparse/tests/test_coo.py::test_bitshift_binary[shape1-rshift] sparse/tests/test_coo.py::test_bitshift_binary[shape2-lshift] sparse/tests/test_coo.py::test_bitshift_binary[shape2-rshift] sparse/tests/test_coo.py::test_bitshift_binary[shape3-lshift] sparse/tests/test_coo.py::test_bitshift_binary[shape3-rshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape0-ilshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape0-irshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape1-ilshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape1-irshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape2-ilshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape2-irshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape3-ilshift] sparse/tests/test_coo.py::test_bitshift_binary_inplace[shape3-irshift] sparse/tests/test_coo.py::test_bitwise_scalar[shape0-and_] sparse/tests/test_coo.py::test_bitwise_scalar[shape1-and_] sparse/tests/test_coo.py::test_bitwise_scalar[shape2-and_] sparse/tests/test_coo.py::test_bitwise_scalar[shape3-and_] sparse/tests/test_coo.py::test_bitshift_scalar[shape0-lshift] sparse/tests/test_coo.py::test_bitshift_scalar[shape0-rshift] sparse/tests/test_coo.py::test_bitshift_scalar[shape1-lshift] sparse/tests/test_coo.py::test_bitshift_scalar[shape1-rshift] sparse/tests/test_coo.py::test_bitshift_scalar[shape2-lshift] sparse/tests/test_coo.py::test_bitshift_scalar[shape2-rshift] sparse/tests/test_coo.py::test_bitshift_scalar[shape3-lshift] sparse/tests/test_coo.py::test_bitshift_scalar[shape3-rshift] sparse/tests/test_coo.py::test_unary_bitwise_nonzero_output_fv[shape0-invert] sparse/tests/test_coo.py::test_unary_bitwise_nonzero_output_fv[shape1-invert] sparse/tests/test_coo.py::test_unary_bitwise_nonzero_output_fv[shape2-invert] sparse/tests/test_coo.py::test_unary_bitwise_nonzero_output_fv[shape3-invert] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape0-or_] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape0-xor] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape1-or_] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape1-xor] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape2-or_] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape2-xor] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape3-or_] sparse/tests/test_coo.py::test_binary_bitwise_nonzero_output_fv[shape3-xor] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape0-mul] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape0-add] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape0-sub] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape0-gt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape0-lt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape0-ne] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape1-mul] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape1-add] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape1-sub] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape1-gt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape1-lt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape1-ne] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape2-mul] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape2-add] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape2-sub] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape2-gt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape2-lt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape2-ne] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape3-mul] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape3-add] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape3-sub] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape3-gt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape3-lt] sparse/tests/test_coo.py::test_elemwise_nonzero_input_fv[shape3-ne] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape0-lshift] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape0-rshift] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape1-lshift] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape1-rshift] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape2-lshift] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape2-rshift] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape3-lshift] sparse/tests/test_coo.py::test_binary_bitshift_densification_fails[shape3-rshift] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape0-and_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape0-or_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape0-xor] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape1-and_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape1-or_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape1-xor] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape2-and_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape2-or_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape2-xor] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape3-and_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape3-or_] sparse/tests/test_coo.py::test_bitwise_binary_bool[shape3-xor] sparse/tests/test_coo.py::test_elemwise_binary_empty sparse/tests/test_coo.py::test_gt sparse/tests/test_coo.py::test_slicing[0] sparse/tests/test_coo.py::test_slicing[1] sparse/tests/test_coo.py::test_slicing[-1] sparse/tests/test_coo.py::test_slicing[index3] sparse/tests/test_coo.py::test_slicing[index4] sparse/tests/test_coo.py::test_slicing[index5] sparse/tests/test_coo.py::test_slicing[index6] sparse/tests/test_coo.py::test_slicing[index7] sparse/tests/test_coo.py::test_slicing[index8] sparse/tests/test_coo.py::test_slicing[index9] sparse/tests/test_coo.py::test_slicing[index10] sparse/tests/test_coo.py::test_slicing[index11] sparse/tests/test_coo.py::test_slicing[index12] sparse/tests/test_coo.py::test_slicing[index13] sparse/tests/test_coo.py::test_slicing[index14] sparse/tests/test_coo.py::test_slicing[index15] sparse/tests/test_coo.py::test_slicing[index16] sparse/tests/test_coo.py::test_slicing[index17] sparse/tests/test_coo.py::test_slicing[index18] sparse/tests/test_coo.py::test_slicing[index19] sparse/tests/test_coo.py::test_slicing[index20] sparse/tests/test_coo.py::test_slicing[index21] sparse/tests/test_coo.py::test_slicing[index22] sparse/tests/test_coo.py::test_slicing[index23] sparse/tests/test_coo.py::test_slicing[index24] sparse/tests/test_coo.py::test_slicing[index25] sparse/tests/test_coo.py::test_slicing[index26] sparse/tests/test_coo.py::test_slicing[index27] sparse/tests/test_coo.py::test_slicing[index28] sparse/tests/test_coo.py::test_slicing[index29] sparse/tests/test_coo.py::test_slicing[index30] sparse/tests/test_coo.py::test_slicing[index31] sparse/tests/test_coo.py::test_slicing[index32] sparse/tests/test_coo.py::test_slicing[index33] sparse/tests/test_coo.py::test_slicing[index34] sparse/tests/test_coo.py::test_slicing[index35] sparse/tests/test_coo.py::test_slicing[index36] sparse/tests/test_coo.py::test_slicing[index37] sparse/tests/test_coo.py::test_slicing[index38] sparse/tests/test_coo.py::test_slicing[index39] sparse/tests/test_coo.py::test_slicing[index40] sparse/tests/test_coo.py::test_slicing[index41] sparse/tests/test_coo.py::test_slicing[index42] sparse/tests/test_coo.py::test_slicing[index43] sparse/tests/test_coo.py::test_slicing[index44] sparse/tests/test_coo.py::test_slicing[index45] sparse/tests/test_coo.py::test_advanced_indexing[index0] sparse/tests/test_coo.py::test_advanced_indexing[index1] sparse/tests/test_coo.py::test_advanced_indexing[index2] sparse/tests/test_coo.py::test_advanced_indexing[index3] sparse/tests/test_coo.py::test_advanced_indexing[index4] sparse/tests/test_coo.py::test_advanced_indexing[index5] sparse/tests/test_coo.py::test_advanced_indexing[index6] sparse/tests/test_coo.py::test_advanced_indexing[index7] sparse/tests/test_coo.py::test_advanced_indexing[index8] sparse/tests/test_coo.py::test_advanced_indexing[index9] sparse/tests/test_coo.py::test_custom_dtype_slicing sparse/tests/test_coo.py::test_slicing_errors[index0] sparse/tests/test_coo.py::test_slicing_errors[index1] sparse/tests/test_coo.py::test_slicing_errors[index2] sparse/tests/test_coo.py::test_slicing_errors[5] sparse/tests/test_coo.py::test_slicing_errors[-5] sparse/tests/test_coo.py::test_slicing_errors[foo] sparse/tests/test_coo.py::test_slicing_errors[index6] sparse/tests/test_coo.py::test_slicing_errors[0.5] sparse/tests/test_coo.py::test_slicing_errors[index8] sparse/tests/test_coo.py::test_slicing_errors[index9] sparse/tests/test_coo.py::test_slicing_errors[index10] sparse/tests/test_coo.py::test_slicing_errors[index11] sparse/tests/test_coo.py::test_concatenate sparse/tests/test_coo.py::test_concatenate_mixed[stack-0] sparse/tests/test_coo.py::test_concatenate_mixed[stack-1] sparse/tests/test_coo.py::test_concatenate_mixed[concatenate-0] sparse/tests/test_coo.py::test_concatenate_mixed[concatenate-1] sparse/tests/test_coo.py::test_concatenate_noarrays sparse/tests/test_coo.py::test_stack[0-shape0] sparse/tests/test_coo.py::test_stack[0-shape1] sparse/tests/test_coo.py::test_stack[0-shape2] sparse/tests/test_coo.py::test_stack[1-shape0] sparse/tests/test_coo.py::test_stack[1-shape1] sparse/tests/test_coo.py::test_stack[1-shape2] sparse/tests/test_coo.py::test_stack[-1-shape0] sparse/tests/test_coo.py::test_stack[-1-shape1] sparse/tests/test_coo.py::test_stack[-1-shape2] sparse/tests/test_coo.py::test_large_concat_stack sparse/tests/test_coo.py::test_addition sparse/tests/test_coo.py::test_scalar_multiplication[2] sparse/tests/test_coo.py::test_scalar_multiplication[2.5] sparse/tests/test_coo.py::test_scalar_multiplication[scalar2] sparse/tests/test_coo.py::test_scalar_multiplication[scalar3] sparse/tests/test_coo.py::test_scalar_exponentiation sparse/tests/test_coo.py::test_create_with_lists_of_tuples sparse/tests/test_coo.py::test_sizeof sparse/tests/test_coo.py::test_scipy_sparse_interface sparse/tests/test_coo.py::test_scipy_sparse_interaction[coo] sparse/tests/test_coo.py::test_scipy_sparse_interaction[csr] sparse/tests/test_coo.py::test_scipy_sparse_interaction[dok] sparse/tests/test_coo.py::test_scipy_sparse_interaction[csc] sparse/tests/test_coo.py::test_op_scipy_sparse[mul] sparse/tests/test_coo.py::test_op_scipy_sparse[add] sparse/tests/test_coo.py::test_op_scipy_sparse[sub] sparse/tests/test_coo.py::test_op_scipy_sparse[gt] sparse/tests/test_coo.py::test_op_scipy_sparse[lt] sparse/tests/test_coo.py::test_op_scipy_sparse[ne] sparse/tests/test_coo.py::test_op_scipy_sparse_left[add] sparse/tests/test_coo.py::test_op_scipy_sparse_left[sub] sparse/tests/test_coo.py::test_cache_csr sparse/tests/test_coo.py::test_empty_shape sparse/tests/test_coo.py::test_single_dimension sparse/tests/test_coo.py::test_large_sum sparse/tests/test_coo.py::test_add_many_sparse_arrays sparse/tests/test_coo.py::test_caching sparse/tests/test_coo.py::test_scalar_slicing sparse/tests/test_coo.py::test_triul[shape0-0] sparse/tests/test_coo.py::test_triul[shape1-1] sparse/tests/test_coo.py::test_triul[shape2--1] sparse/tests/test_coo.py::test_triul[shape3--2] sparse/tests/test_coo.py::test_triul[shape4-1000] sparse/tests/test_coo.py::test_empty_reduction sparse/tests/test_coo.py::test_random_shape[0.1-shape0] sparse/tests/test_coo.py::test_random_shape[0.1-shape1] sparse/tests/test_coo.py::test_random_shape[0.1-shape2] sparse/tests/test_coo.py::test_random_shape[0.3-shape0] sparse/tests/test_coo.py::test_random_shape[0.3-shape1] sparse/tests/test_coo.py::test_random_shape[0.3-shape2] sparse/tests/test_coo.py::test_random_shape[0.5-shape0] sparse/tests/test_coo.py::test_random_shape[0.5-shape1] sparse/tests/test_coo.py::test_random_shape[0.5-shape2] sparse/tests/test_coo.py::test_random_shape[0.7-shape0] sparse/tests/test_coo.py::test_random_shape[0.7-shape1] sparse/tests/test_coo.py::test_random_shape[0.7-shape2] sparse/tests/test_coo.py::test_two_random_unequal sparse/tests/test_coo.py::test_two_random_same_seed sparse/tests/test_coo.py::test_random_rvs[0.0-shape0-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.0-shape0-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.0-shape0-<lambda>-bool] sparse/tests/test_coo.py::test_random_rvs[0.0-shape1-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.0-shape1-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.0-shape1-<lambda>-bool] sparse/tests/test_coo.py::test_random_rvs[0.01-shape0-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.01-shape0-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.01-shape0-<lambda>-bool] sparse/tests/test_coo.py::test_random_rvs[0.01-shape1-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.01-shape1-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.01-shape1-<lambda>-bool] sparse/tests/test_coo.py::test_random_rvs[0.1-shape0-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.1-shape0-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.1-shape0-<lambda>-bool] sparse/tests/test_coo.py::test_random_rvs[0.1-shape1-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.1-shape1-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.1-shape1-<lambda>-bool] sparse/tests/test_coo.py::test_random_rvs[0.2-shape0-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.2-shape0-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.2-shape0-<lambda>-bool] sparse/tests/test_coo.py::test_random_rvs[0.2-shape1-None-float64] sparse/tests/test_coo.py::test_random_rvs[0.2-shape1-rvs-int] sparse/tests/test_coo.py::test_random_rvs[0.2-shape1-<lambda>-bool] sparse/tests/test_coo.py::test_random_fv[coo] sparse/tests/test_coo.py::test_random_fv[dok] sparse/tests/test_coo.py::test_scalar_shape_construction sparse/tests/test_coo.py::test_len sparse/tests/test_coo.py::test_density sparse/tests/test_coo.py::test_size sparse/tests/test_coo.py::test_np_array sparse/tests/test_coo.py::test_three_arg_where[shapes0] sparse/tests/test_coo.py::test_three_arg_where[shapes1] sparse/tests/test_coo.py::test_three_arg_where[shapes2] sparse/tests/test_coo.py::test_three_arg_where[shapes3] sparse/tests/test_coo.py::test_three_arg_where[shapes4] sparse/tests/test_coo.py::test_three_arg_where[shapes5] sparse/tests/test_coo.py::test_three_arg_where[shapes6] sparse/tests/test_coo.py::test_three_arg_where[shapes7] sparse/tests/test_coo.py::test_one_arg_where sparse/tests/test_coo.py::test_one_arg_where_dense sparse/tests/test_coo.py::test_two_arg_where sparse/tests/test_coo.py::test_inplace_invalid_shape[imul] sparse/tests/test_coo.py::test_inplace_invalid_shape[iadd] sparse/tests/test_coo.py::test_inplace_invalid_shape[isub] sparse/tests/test_coo.py::test_nonzero sparse/tests/test_coo.py::test_argwhere sparse/tests/test_coo.py::test_asformat[coo] sparse/tests/test_coo.py::test_asformat[dok] sparse/tests/test_coo.py::test_as_coo[COO] sparse/tests/test_coo.py::test_as_coo[DOK] sparse/tests/test_coo.py::test_as_coo[csr_matrix] sparse/tests/test_coo.py::test_as_coo[asarray] sparse/tests/test_coo.py::test_invalid_attrs_error sparse/tests/test_coo.py::test_invalid_iterable_error sparse/tests/test_coo.py::TestRoll::test_1d[0] sparse/tests/test_coo.py::TestRoll::test_1d[2] sparse/tests/test_coo.py::TestRoll::test_1d[-2] sparse/tests/test_coo.py::TestRoll::test_1d[20] sparse/tests/test_coo.py::TestRoll::test_1d[-20] sparse/tests/test_coo.py::TestRoll::test_2d[None-0] sparse/tests/test_coo.py::TestRoll::test_2d[None-2] sparse/tests/test_coo.py::TestRoll::test_2d[None--2] sparse/tests/test_coo.py::TestRoll::test_2d[None-20] sparse/tests/test_coo.py::TestRoll::test_2d[None--20] sparse/tests/test_coo.py::TestRoll::test_2d[0-0] sparse/tests/test_coo.py::TestRoll::test_2d[0-2] sparse/tests/test_coo.py::TestRoll::test_2d[0--2] sparse/tests/test_coo.py::TestRoll::test_2d[0-20] sparse/tests/test_coo.py::TestRoll::test_2d[0--20] sparse/tests/test_coo.py::TestRoll::test_2d[1-0] sparse/tests/test_coo.py::TestRoll::test_2d[1-2] sparse/tests/test_coo.py::TestRoll::test_2d[1--2] sparse/tests/test_coo.py::TestRoll::test_2d[1-20] sparse/tests/test_coo.py::TestRoll::test_2d[1--20] sparse/tests/test_coo.py::TestRoll::test_2d[ax3-0] sparse/tests/test_coo.py::TestRoll::test_2d[ax3-2] sparse/tests/test_coo.py::TestRoll::test_2d[ax3--2] sparse/tests/test_coo.py::TestRoll::test_2d[ax3-20] sparse/tests/test_coo.py::TestRoll::test_2d[ax3--20] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax0-shift0] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax0-shift1] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax0-shift2] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax0-shift3] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax1-shift0] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax1-shift1] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax1-shift2] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax1-shift3] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax2-shift0] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax2-shift1] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax2-shift2] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax2-shift3] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax3-shift0] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax3-shift1] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax3-shift2] sparse/tests/test_coo.py::TestRoll::test_multiaxis[ax3-shift3] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[None-0] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[None-2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[None--2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[None-20] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[None--20] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[0-0] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[0-2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[0--2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[0-20] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[0--20] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[1-0] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[1-2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[1--2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[1-20] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[1--20] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[ax3-0] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[ax3-2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[ax3--2] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[ax3-20] sparse/tests/test_coo.py::TestRoll::test_original_is_copied[ax3--20] sparse/tests/test_coo.py::TestRoll::test_empty sparse/tests/test_coo.py::TestRoll::test_valerr[args0] sparse/tests/test_coo.py::TestRoll::test_valerr[args1] sparse/tests/test_coo.py::TestRoll::test_valerr[args2] sparse/tests/test_coo.py::TestRoll::test_valerr[args3] sparse/tests/test_coo.py::TestFailFillValue::test_nonzero_fv sparse/tests/test_coo.py::TestFailFillValue::test_inconsistent_fv sparse/tests/test_coo.py::test_initialization[2] sparse/tests/test_coo.py::test_initialization[3] sparse/tests/test_coo.py::test_initialization[4] sparse/tests/test_coo.py::test_initialization[5] sparse/tests/test_dok.py::test_random_shape_nnz[0.1-shape0] sparse/tests/test_dok.py::test_random_shape_nnz[0.1-shape1] sparse/tests/test_dok.py::test_random_shape_nnz[0.1-shape2] sparse/tests/test_dok.py::test_random_shape_nnz[0.3-shape0] sparse/tests/test_dok.py::test_random_shape_nnz[0.3-shape1] sparse/tests/test_dok.py::test_random_shape_nnz[0.3-shape2] sparse/tests/test_dok.py::test_random_shape_nnz[0.5-shape0] sparse/tests/test_dok.py::test_random_shape_nnz[0.5-shape1] sparse/tests/test_dok.py::test_random_shape_nnz[0.5-shape2] sparse/tests/test_dok.py::test_random_shape_nnz[0.7-shape0] sparse/tests/test_dok.py::test_random_shape_nnz[0.7-shape1] sparse/tests/test_dok.py::test_random_shape_nnz[0.7-shape2] sparse/tests/test_dok.py::test_convert_to_coo sparse/tests/test_dok.py::test_convert_from_coo sparse/tests/test_dok.py::test_convert_from_numpy sparse/tests/test_dok.py::test_convert_to_numpy sparse/tests/test_dok.py::test_construct[2-data0] sparse/tests/test_dok.py::test_construct[shape1-data1] sparse/tests/test_dok.py::test_construct[shape2-data2] sparse/tests/test_dok.py::test_getitem[0.1-shape0] sparse/tests/test_dok.py::test_getitem[0.1-shape1] sparse/tests/test_dok.py::test_getitem[0.1-shape2] sparse/tests/test_dok.py::test_getitem[0.3-shape0] sparse/tests/test_dok.py::test_getitem[0.3-shape1] sparse/tests/test_dok.py::test_getitem[0.3-shape2] sparse/tests/test_dok.py::test_getitem[0.5-shape0] sparse/tests/test_dok.py::test_getitem[0.5-shape1] sparse/tests/test_dok.py::test_getitem[0.5-shape2] sparse/tests/test_dok.py::test_getitem[0.7-shape0] sparse/tests/test_dok.py::test_getitem[0.7-shape1] sparse/tests/test_dok.py::test_getitem[0.7-shape2] sparse/tests/test_dok.py::test_setitem[shape2-index2-value2] sparse/tests/test_dok.py::test_setitem[shape6-index6-value6] sparse/tests/test_dok.py::test_setitem[shape7-index7-value7] sparse/tests/test_dok.py::test_setitem[shape8-index8-value8] sparse/tests/test_dok.py::test_setitem[shape10-index10-value10] sparse/tests/test_dok.py::test_setitem[shape12-index12-value12] sparse/tests/test_dok.py::test_default_dtype sparse/tests/test_dok.py::test_int_dtype sparse/tests/test_dok.py::test_float_dtype sparse/tests/test_dok.py::test_set_zero sparse/tests/test_dok.py::test_asformat[coo] sparse/tests/test_dok.py::test_asformat[dok] sparse/tests/test_io.py::test_save_load_npz_file[True] sparse/tests/test_io.py::test_save_load_npz_file[False] sparse/tests/test_io.py::test_load_wrong_format_exception
sparse/utils.py docs/changelog.rst sparse/coo/umath.py docs/operations.rst sparse/coo/core.py
sparse/utils.py docs/changelog.rst sparse/coo/umath.py docs/operations.rst sparse/coo/core.py