test_norm.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """Test functions for the sparse.linalg.norm module
  2. """
  3. from __future__ import division, print_function, absolute_import
  4. import numpy as np
  5. from numpy.linalg import norm as npnorm
  6. from numpy.testing import assert_equal, assert_allclose
  7. from pytest import raises as assert_raises
  8. from scipy._lib._version import NumpyVersion
  9. import scipy.sparse
  10. from scipy.sparse.linalg import norm as spnorm
  11. class TestNorm(object):
  12. def setup_method(self):
  13. a = np.arange(9) - 4
  14. b = a.reshape((3, 3))
  15. self.b = scipy.sparse.csr_matrix(b)
  16. def test_matrix_norm(self):
  17. # Frobenius norm is the default
  18. assert_allclose(spnorm(self.b), 7.745966692414834)
  19. assert_allclose(spnorm(self.b, 'fro'), 7.745966692414834)
  20. assert_allclose(spnorm(self.b, np.inf), 9)
  21. assert_allclose(spnorm(self.b, -np.inf), 2)
  22. assert_allclose(spnorm(self.b, 1), 7)
  23. assert_allclose(spnorm(self.b, -1), 6)
  24. # _multi_svd_norm is not implemented for sparse matrix
  25. assert_raises(NotImplementedError, spnorm, self.b, 2)
  26. assert_raises(NotImplementedError, spnorm, self.b, -2)
  27. def test_matrix_norm_axis(self):
  28. for m, axis in ((self.b, None), (self.b, (0, 1)), (self.b.T, (1, 0))):
  29. assert_allclose(spnorm(m, axis=axis), 7.745966692414834)
  30. assert_allclose(spnorm(m, 'fro', axis=axis), 7.745966692414834)
  31. assert_allclose(spnorm(m, np.inf, axis=axis), 9)
  32. assert_allclose(spnorm(m, -np.inf, axis=axis), 2)
  33. assert_allclose(spnorm(m, 1, axis=axis), 7)
  34. assert_allclose(spnorm(m, -1, axis=axis), 6)
  35. def test_vector_norm(self):
  36. v = [4.5825756949558398, 4.2426406871192848, 4.5825756949558398]
  37. for m, a in (self.b, 0), (self.b.T, 1):
  38. for axis in a, (a, ), a-2, (a-2, ):
  39. assert_allclose(spnorm(m, 1, axis=axis), [7, 6, 7])
  40. assert_allclose(spnorm(m, np.inf, axis=axis), [4, 3, 4])
  41. assert_allclose(spnorm(m, axis=axis), v)
  42. assert_allclose(spnorm(m, ord=2, axis=axis), v)
  43. assert_allclose(spnorm(m, ord=None, axis=axis), v)
  44. def test_norm_exceptions(self):
  45. m = self.b
  46. assert_raises(TypeError, spnorm, m, None, 1.5)
  47. assert_raises(TypeError, spnorm, m, None, [2])
  48. assert_raises(ValueError, spnorm, m, None, ())
  49. assert_raises(ValueError, spnorm, m, None, (0, 1, 2))
  50. assert_raises(ValueError, spnorm, m, None, (0, 0))
  51. assert_raises(ValueError, spnorm, m, None, (0, 2))
  52. assert_raises(ValueError, spnorm, m, None, (-3, 0))
  53. assert_raises(ValueError, spnorm, m, None, 2)
  54. assert_raises(ValueError, spnorm, m, None, -3)
  55. assert_raises(ValueError, spnorm, m, 'plate_of_shrimp', 0)
  56. assert_raises(ValueError, spnorm, m, 'plate_of_shrimp', (0, 1))
  57. class TestVsNumpyNorm(object):
  58. _sparse_types = (
  59. scipy.sparse.bsr_matrix,
  60. scipy.sparse.coo_matrix,
  61. scipy.sparse.csc_matrix,
  62. scipy.sparse.csr_matrix,
  63. scipy.sparse.dia_matrix,
  64. scipy.sparse.dok_matrix,
  65. scipy.sparse.lil_matrix,
  66. )
  67. _test_matrices = (
  68. (np.arange(9) - 4).reshape((3, 3)),
  69. [
  70. [1, 2, 3],
  71. [-1, 1, 4]],
  72. [
  73. [1, 0, 3],
  74. [-1, 1, 4j]],
  75. )
  76. def test_sparse_matrix_norms(self):
  77. for sparse_type in self._sparse_types:
  78. for M in self._test_matrices:
  79. S = sparse_type(M)
  80. assert_allclose(spnorm(S), npnorm(M))
  81. assert_allclose(spnorm(S, 'fro'), npnorm(M, 'fro'))
  82. assert_allclose(spnorm(S, np.inf), npnorm(M, np.inf))
  83. assert_allclose(spnorm(S, -np.inf), npnorm(M, -np.inf))
  84. assert_allclose(spnorm(S, 1), npnorm(M, 1))
  85. assert_allclose(spnorm(S, -1), npnorm(M, -1))
  86. def test_sparse_matrix_norms_with_axis(self):
  87. for sparse_type in self._sparse_types:
  88. for M in self._test_matrices:
  89. S = sparse_type(M)
  90. for axis in None, (0, 1), (1, 0):
  91. assert_allclose(spnorm(S, axis=axis), npnorm(M, axis=axis))
  92. for ord in 'fro', np.inf, -np.inf, 1, -1:
  93. assert_allclose(spnorm(S, ord, axis=axis),
  94. npnorm(M, ord, axis=axis))
  95. # Some numpy matrix norms are allergic to negative axes.
  96. for axis in (-2, -1), (-1, -2), (1, -2):
  97. assert_allclose(spnorm(S, axis=axis), npnorm(M, axis=axis))
  98. assert_allclose(spnorm(S, 'f', axis=axis),
  99. npnorm(M, 'f', axis=axis))
  100. assert_allclose(spnorm(S, 'fro', axis=axis),
  101. npnorm(M, 'fro', axis=axis))
  102. def test_sparse_vector_norms(self):
  103. for sparse_type in self._sparse_types:
  104. for M in self._test_matrices:
  105. S = sparse_type(M)
  106. for axis in (0, 1, -1, -2, (0, ), (1, ), (-1, ), (-2, )):
  107. assert_allclose(spnorm(S, axis=axis), npnorm(M, axis=axis))
  108. for ord in None, 2, np.inf, -np.inf, 1, 0.5, 0.42:
  109. assert_allclose(spnorm(S, ord, axis=axis),
  110. npnorm(M, ord, axis=axis))