|
5 | 5 | import itertools
|
6 | 6 | from distutils.version import LooseVersion as V
|
7 | 7 |
|
8 |
| -from nose.tools import assert_raises, assert_equal |
| 8 | +from nose.tools import assert_raises, assert_equal, assert_true |
9 | 9 |
|
10 | 10 | import numpy as np
|
11 | 11 | from numpy.testing.utils import assert_array_equal, assert_array_almost_equal
|
@@ -39,15 +39,80 @@ def test_BoundaryNorm():
|
39 | 39 | Github issue #1258: interpolation was failing with numpy
|
40 | 40 | 1.7 pre-release.
|
41 | 41 | """
|
42 |
| - # TODO: expand this into a more general test of BoundaryNorm. |
| 42 | + |
43 | 43 | boundaries = [0, 1.1, 2.2]
|
44 |
| - vals = [-1, 0, 2, 2.2, 4] |
45 |
| - expected = [-1, 0, 2, 3, 3] |
| 44 | + vals = [-1, 0, 1, 2, 2.2, 4] |
| 45 | + |
| 46 | + # Without interpolation |
| 47 | + expected = [-1, 0, 0, 1, 2, 2] |
| 48 | + ncolors = len(boundaries) - 1 |
| 49 | + bn = mcolors.BoundaryNorm(boundaries, ncolors) |
| 50 | + assert_array_equal(bn(vals), expected) |
| 51 | + |
46 | 52 | # ncolors != len(boundaries) - 1 triggers interpolation
|
| 53 | + expected = [-1, 0, 0, 2, 3, 3] |
47 | 54 | ncolors = len(boundaries)
|
48 | 55 | bn = mcolors.BoundaryNorm(boundaries, ncolors)
|
49 | 56 | assert_array_equal(bn(vals), expected)
|
50 | 57 |
|
| 58 | + # more boundaries for a third color |
| 59 | + boundaries = [0, 1, 2, 3] |
| 60 | + vals = [-1, 0.1, 1.1, 2.2, 4] |
| 61 | + ncolors = 5 |
| 62 | + expected = [-1, 0, 2, 4, 5] |
| 63 | + bn = mcolors.BoundaryNorm(boundaries, ncolors) |
| 64 | + assert_array_equal(bn(vals), expected) |
| 65 | + |
| 66 | + # a scalar as input should not trigger an error and should return a scalar |
| 67 | + boundaries = [0, 1, 2] |
| 68 | + vals = [-1, 0.1, 1.1, 2.2] |
| 69 | + bn = mcolors.BoundaryNorm(boundaries, 2) |
| 70 | + expected = [-1, 0, 1, 2] |
| 71 | + for v, ex in zip(vals, expected): |
| 72 | + ret = bn(v) |
| 73 | + assert_true(isinstance(ret, six.integer_types)) |
| 74 | + assert_array_equal(ret, ex) |
| 75 | + assert_array_equal(bn([v]), ex) |
| 76 | + |
| 77 | + # same with interp |
| 78 | + bn = mcolors.BoundaryNorm(boundaries, 3) |
| 79 | + expected = [-1, 0, 2, 3] |
| 80 | + for v, ex in zip(vals, expected): |
| 81 | + ret = bn(v) |
| 82 | + assert_true(isinstance(ret, six.integer_types)) |
| 83 | + assert_array_equal(ret, ex) |
| 84 | + assert_array_equal(bn([v]), ex) |
| 85 | + |
| 86 | + # Clipping |
| 87 | + bn = mcolors.BoundaryNorm(boundaries, 3, clip=True) |
| 88 | + expected = [0, 0, 2, 2] |
| 89 | + for v, ex in zip(vals, expected): |
| 90 | + ret = bn(v) |
| 91 | + assert_true(isinstance(ret, six.integer_types)) |
| 92 | + assert_array_equal(ret, ex) |
| 93 | + assert_array_equal(bn([v]), ex) |
| 94 | + |
| 95 | + # Masked arrays |
| 96 | + boundaries = [0, 1.1, 2.2] |
| 97 | + vals = np.ma.masked_invalid([-1., np.NaN, 0, 1.4, 9]) |
| 98 | + |
| 99 | + # Without interpolation |
| 100 | + ncolors = len(boundaries) - 1 |
| 101 | + bn = mcolors.BoundaryNorm(boundaries, ncolors) |
| 102 | + expected = np.ma.masked_array([-1, -99, 0, 1, 2], mask=[0, 1, 0, 0, 0]) |
| 103 | + assert_array_equal(bn(vals), expected) |
| 104 | + |
| 105 | + # With interpolation |
| 106 | + bn = mcolors.BoundaryNorm(boundaries, len(boundaries)) |
| 107 | + expected = np.ma.masked_array([-1, -99, 0, 2, 3], mask=[0, 1, 0, 0, 0]) |
| 108 | + assert_array_equal(bn(vals), expected) |
| 109 | + |
| 110 | + # Non-trivial masked arrays |
| 111 | + vals = np.ma.masked_invalid([np.Inf, np.NaN]) |
| 112 | + assert_true(np.all(bn(vals).mask)) |
| 113 | + vals = np.ma.masked_invalid([np.Inf]) |
| 114 | + assert_true(np.all(bn(vals).mask)) |
| 115 | + |
51 | 116 |
|
52 | 117 | def test_LogNorm():
|
53 | 118 | """
|
|
0 commit comments