|
"""Test of min-max 1D features of sparse array classes""" |
|
|
|
import pytest |
|
|
|
import numpy as np |
|
|
|
from numpy.testing import assert_equal, assert_array_equal |
|
|
|
from scipy.sparse import coo_array, csr_array, csc_array, bsr_array |
|
from scipy.sparse import coo_matrix, csr_matrix, csc_matrix, bsr_matrix |
|
from scipy.sparse._sputils import isscalarlike |
|
|
|
|
|
def toarray(a): |
|
if isinstance(a, np.ndarray) or isscalarlike(a): |
|
return a |
|
return a.toarray() |
|
|
|
|
|
formats_for_minmax = [bsr_array, coo_array, csc_array, csr_array] |
|
formats_for_minmax_supporting_1d = [coo_array, csr_array] |
|
|
|
|
|
@pytest.mark.parametrize("spcreator", formats_for_minmax_supporting_1d) |
|
class Test_MinMaxMixin1D: |
|
def test_minmax(self, spcreator): |
|
D = np.arange(5) |
|
X = spcreator(D) |
|
|
|
assert_equal(X.min(), 0) |
|
assert_equal(X.max(), 4) |
|
assert_equal((-X).min(), -4) |
|
assert_equal((-X).max(), 0) |
|
|
|
def test_minmax_axis(self, spcreator): |
|
D = np.arange(50) |
|
X = spcreator(D) |
|
|
|
for axis in [0, -1]: |
|
assert_array_equal( |
|
toarray(X.max(axis=axis)), D.max(axis=axis, keepdims=True) |
|
) |
|
assert_array_equal( |
|
toarray(X.min(axis=axis)), D.min(axis=axis, keepdims=True) |
|
) |
|
for axis in [-2, 1]: |
|
with pytest.raises(ValueError, match="axis out of range"): |
|
X.min(axis=axis) |
|
with pytest.raises(ValueError, match="axis out of range"): |
|
X.max(axis=axis) |
|
|
|
def test_numpy_minmax(self, spcreator): |
|
dat = np.array([0, 1, 2]) |
|
datsp = spcreator(dat) |
|
assert_array_equal(np.min(datsp), np.min(dat)) |
|
assert_array_equal(np.max(datsp), np.max(dat)) |
|
|
|
|
|
def test_argmax(self, spcreator): |
|
D1 = np.array([-1, 5, 2, 3]) |
|
D2 = np.array([0, 0, -1, -2]) |
|
D3 = np.array([-1, -2, -3, -4]) |
|
D4 = np.array([1, 2, 3, 4]) |
|
D5 = np.array([1, 2, 0, 0]) |
|
|
|
for D in [D1, D2, D3, D4, D5]: |
|
mat = spcreator(D) |
|
|
|
assert_equal(mat.argmax(), np.argmax(D)) |
|
assert_equal(mat.argmin(), np.argmin(D)) |
|
|
|
assert_equal(mat.argmax(axis=0), np.argmax(D, axis=0)) |
|
assert_equal(mat.argmin(axis=0), np.argmin(D, axis=0)) |
|
|
|
D6 = np.empty((0,)) |
|
|
|
for axis in [None, 0]: |
|
mat = spcreator(D6) |
|
with pytest.raises(ValueError, match="to an empty matrix"): |
|
mat.argmin(axis=axis) |
|
with pytest.raises(ValueError, match="to an empty matrix"): |
|
mat.argmax(axis=axis) |
|
|
|
|
|
@pytest.mark.parametrize("spcreator", formats_for_minmax) |
|
class Test_ShapeMinMax2DWithAxis: |
|
def test_minmax(self, spcreator): |
|
dat = np.array([[-1, 5, 0, 3], [0, 0, -1, -2], [0, 0, 1, 2]]) |
|
datsp = spcreator(dat) |
|
|
|
for (spminmax, npminmax) in [ |
|
(datsp.min, np.min), |
|
(datsp.max, np.max), |
|
(datsp.nanmin, np.nanmin), |
|
(datsp.nanmax, np.nanmax), |
|
]: |
|
for ax, result_shape in [(0, (4,)), (1, (3,))]: |
|
assert_equal(toarray(spminmax(axis=ax)), npminmax(dat, axis=ax)) |
|
assert_equal(spminmax(axis=ax).shape, result_shape) |
|
assert spminmax(axis=ax).format == "coo" |
|
|
|
for spminmax in [datsp.argmin, datsp.argmax]: |
|
for ax in [0, 1]: |
|
assert isinstance(spminmax(axis=ax), np.ndarray) |
|
|
|
|
|
spmat_form = { |
|
'coo': coo_matrix, |
|
'csr': csr_matrix, |
|
'csc': csc_matrix, |
|
'bsr': bsr_matrix, |
|
} |
|
datspm = spmat_form[datsp.format](dat) |
|
|
|
for spm, npm in [ |
|
(datspm.min, np.min), |
|
(datspm.max, np.max), |
|
(datspm.nanmin, np.nanmin), |
|
(datspm.nanmax, np.nanmax), |
|
]: |
|
for ax, result_shape in [(0, (1, 4)), (1, (3, 1))]: |
|
assert_equal(toarray(spm(axis=ax)), npm(dat, axis=ax, keepdims=True)) |
|
assert_equal(spm(axis=ax).shape, result_shape) |
|
assert spm(axis=ax).format == "coo" |
|
|
|
for spminmax in [datspm.argmin, datspm.argmax]: |
|
for ax in [0, 1]: |
|
assert isinstance(spminmax(axis=ax), np.ndarray) |
|
|