test_minmax1d.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """Test of min-max 1D features of sparse array classes"""
  2. import pytest
  3. import numpy as np
  4. from numpy.testing import assert_equal, assert_array_equal
  5. from scipy.sparse import coo_array, csr_array, csc_array, bsr_array
  6. from scipy.sparse import coo_matrix, csr_matrix, csc_matrix, bsr_matrix
  7. from scipy.sparse._sputils import isscalarlike
  8. def toarray(a):
  9. if isinstance(a, np.ndarray) or isscalarlike(a):
  10. return a
  11. return a.toarray()
  12. formats_for_minmax = [bsr_array, coo_array, csc_array, csr_array]
  13. formats_for_minmax_supporting_1d = [coo_array, csr_array]
  14. @pytest.mark.parametrize("spcreator", formats_for_minmax_supporting_1d)
  15. class Test_MinMaxMixin1D:
  16. def test_minmax(self, spcreator):
  17. D = np.arange(5)
  18. X = spcreator(D)
  19. assert_equal(X.min(), 0)
  20. assert_equal(X.max(), 4)
  21. assert_equal((-X).min(), -4)
  22. assert_equal((-X).max(), 0)
  23. def test_minmax_axis(self, spcreator):
  24. D = np.arange(50)
  25. X = spcreator(D)
  26. for axis in [0, -1]:
  27. assert_array_equal(
  28. toarray(X.max(axis=axis)), D.max(axis=axis, keepdims=True)
  29. )
  30. assert_array_equal(
  31. toarray(X.min(axis=axis)), D.min(axis=axis, keepdims=True)
  32. )
  33. for axis in [-2, 1]:
  34. with pytest.raises(ValueError, match="axis out of range"):
  35. X.min(axis=axis)
  36. with pytest.raises(ValueError, match="axis out of range"):
  37. X.max(axis=axis)
  38. def test_numpy_minmax(self, spcreator):
  39. dat = np.array([0, 1, 2])
  40. datsp = spcreator(dat)
  41. assert_array_equal(np.min(datsp), np.min(dat))
  42. assert_array_equal(np.max(datsp), np.max(dat))
  43. def test_argmax(self, spcreator):
  44. D1 = np.array([-1, 5, 2, 3])
  45. D2 = np.array([0, 0, -1, -2])
  46. D3 = np.array([-1, -2, -3, -4])
  47. D4 = np.array([1, 2, 3, 4])
  48. D5 = np.array([1, 2, 0, 0])
  49. for D in [D1, D2, D3, D4, D5]:
  50. mat = spcreator(D)
  51. assert_equal(mat.argmax(), np.argmax(D))
  52. assert_equal(mat.argmin(), np.argmin(D))
  53. assert_equal(mat.argmax(axis=0), np.argmax(D, axis=0))
  54. assert_equal(mat.argmin(axis=0), np.argmin(D, axis=0))
  55. D6 = np.empty((0,))
  56. for axis in [None, 0]:
  57. mat = spcreator(D6)
  58. with pytest.raises(ValueError, match="to an empty matrix"):
  59. mat.argmin(axis=axis)
  60. with pytest.raises(ValueError, match="to an empty matrix"):
  61. mat.argmax(axis=axis)
  62. @pytest.mark.parametrize("spcreator", formats_for_minmax)
  63. class Test_ShapeMinMax2DWithAxis:
  64. def test_minmax(self, spcreator):
  65. dat = np.array([[-1, 5, 0, 3], [0, 0, -1, -2], [0, 0, 1, 2]])
  66. datsp = spcreator(dat)
  67. for (spminmax, npminmax) in [
  68. (datsp.min, np.min),
  69. (datsp.max, np.max),
  70. (datsp.nanmin, np.nanmin),
  71. (datsp.nanmax, np.nanmax),
  72. ]:
  73. for ax, result_shape in [(0, (4,)), (1, (3,))]:
  74. assert_equal(toarray(spminmax(axis=ax)), npminmax(dat, axis=ax))
  75. assert_equal(spminmax(axis=ax).shape, result_shape)
  76. assert spminmax(axis=ax).format == "coo"
  77. for spminmax in [datsp.argmin, datsp.argmax]:
  78. for ax in [0, 1]:
  79. assert isinstance(spminmax(axis=ax), np.ndarray)
  80. # verify spmatrix behavior
  81. spmat_form = {
  82. 'coo': coo_matrix,
  83. 'csr': csr_matrix,
  84. 'csc': csc_matrix,
  85. 'bsr': bsr_matrix,
  86. }
  87. datspm = spmat_form[datsp.format](dat)
  88. for spm, npm in [
  89. (datspm.min, np.min),
  90. (datspm.max, np.max),
  91. (datspm.nanmin, np.nanmin),
  92. (datspm.nanmax, np.nanmax),
  93. ]:
  94. for ax, result_shape in [(0, (1, 4)), (1, (3, 1))]:
  95. assert_equal(toarray(spm(axis=ax)), npm(dat, axis=ax, keepdims=True))
  96. assert_equal(spm(axis=ax).shape, result_shape)
  97. assert spm(axis=ax).format == "coo"
  98. for spminmax in [datspm.argmin, datspm.argmax]:
  99. for ax in [0, 1]:
  100. assert isinstance(spminmax(axis=ax), np.ndarray)