diff --git a/stdlib/numpy/format.codon b/stdlib/numpy/format.codon index 1a053d2d..cf06db6a 100644 --- a/stdlib/numpy/format.codon +++ b/stdlib/numpy/format.codon @@ -57,8 +57,8 @@ class FloatingFormat: self.__init__() return - min_val = None - max_val = None + min_val: Optional[a.dtype] = None + max_val: Optional[a.dtype] = None finite = 0 abs_non_zero = 0 exp_format = False diff --git a/stdlib/numpy/routines.codon b/stdlib/numpy/routines.codon index 1c845ac7..bebfdb54 100644 --- a/stdlib/numpy/routines.codon +++ b/stdlib/numpy/routines.codon @@ -2661,7 +2661,7 @@ def pad(array, pad_width, mode = 'constant', **kwargs): if dtype is int or isinstance(dtype, Int) or isinstance(dtype, UInt): return util.cast(util.rint(x), dtype) else: - return x + return util.cast(x, dtype) def pad_from_function(a: ndarray, pw, padding_func, kwargs, extra = None): shape = a.shape @@ -2915,7 +2915,7 @@ def pad(array, pad_width, mode = 'constant', **kwargs): fill_linear(vector, offset=(n - p2), start=util.cast(end2, float), - stop=util.cast(start1, float), + stop=util.cast(start2, float), num=p2, rev=True) diff --git a/test/numpy/test_routines.codon b/test/numpy/test_routines.codon index 8411ef83..bdd72b54 100644 --- a/test/numpy/test_routines.codon +++ b/test/numpy/test_routines.codon @@ -1238,7 +1238,7 @@ test_fill_diagonal(np.zeros((3, 5), int), @test def test_pad(array, pad_width, expected, mode='constant', **kwargs): - assert (np.pad(array, pad_width, mode, **kwargs) == expected).all() + assert np.allclose(np.pad(array, pad_width, mode, **kwargs), expected) test_pad([1, 2, 3, 4, 5], (2, 3), np.array([4, 4, 1, 2, 3, 4, 5, 6, 6, 6]), @@ -1270,6 +1270,400 @@ test_pad([1, 2, 3, 4, 5], (2, 3), test_pad([1, 2, 3, 4, 5], (2, 3), np.array([4, 5, 1, 2, 3, 4, 5, 1, 2, 3]), 'wrap') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([4, 4, 1, 2, 3, 4, 5, 6, 6, 6], dtype=np.float32), + 'constant', + constant_values=(4, 6)) +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([1, 1, 1, 2, 3, 4, 5, 5, 5, 5], dtype=np.float32), + 'edge') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([5, 3, 1, 2, 3, 4, 5, 2, -1, -4], dtype=np.float32), + 'linear_ramp', + end_values=(5, -4)) +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, ), + np.array([5, 5, 1, 2, 3, 4, 5, 5, 5], dtype=np.float32), + 'maximum') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, ), + np.array([3, 3, 1, 2, 3, 4, 5, 3, 3], dtype=np.float32), + 'mean') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, ), + np.array([3, 3, 1, 2, 3, 4, 5, 3, 3], dtype=np.float32), + 'median') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([3, 2, 1, 2, 3, 4, 5, 4, 3, 2], dtype=np.float32), + 'reflect') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=np.float32), + 'reflect', + reflect_type='odd') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([2, 1, 1, 2, 3, 4, 5, 5, 4, 3], dtype=np.float32), + 'symmetric') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([0, 1, 1, 2, 3, 4, 5, 5, 6, 7], dtype=np.float32), + 'symmetric', + reflect_type='odd') +test_pad(np.array([1, 2, 3, 4, 5], dtype=np.float32), (2, 3), + np.array([4, 5, 1, 2, 3, 4, 5, 1, 2, 3], dtype=np.float32), + 'wrap') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.], + [0., 0., 1., 2., 0., 0., 0.], + [0., 0., 3., 4., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.]], dtype=np.float32), + 'constant') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [3., 3., 3., 4., 4., 4., 4.], + [3., 3., 3., 4., 4., 4., 4.], + [3., 3., 3., 4., 4., 4., 4.]], dtype=np.float32), + 'edge') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[0. , 0. , 0. , 0. , 0. , + 0. , 0. ], + [0. , 0.16666667, 0.33333334, 0.6666667 , 0.44444448, + 0.22222224, 0. ], + [0. , 0.33333334, 0.6666667 , 1.3333334 , 0.88888896, + 0.44444448, 0. ], + [0. , 0.5 , 1. , 2. , 1.3333334 , + 0.6666667 , 0. ], + [0. , 1.5 , 3. , 4. , 2.6666667 , + 1.3333334 , 0. ], + [0. , 0.75 , 1.5 , 2. , 1.3333334 , + 0.6666667 , 0. ], + [0. , 0. , 0. , 0. , 0. , + 0. , 0. ]], dtype=np.float32), + 'linear_ramp') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.], + [2., 2., 1., 2., 2., 2., 2.], + [4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.]], dtype=np.float32), + 'maximum') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [1.5, 1.5, 1. , 2. , 1.5, 1.5, 1.5], + [3.5, 3.5, 3. , 4. , 3.5, 3.5, 3.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5]], dtype=np.float32), + 'mean') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [1.5, 1.5, 1. , 2. , 1.5, 1.5, 1.5], + [3.5, 3.5, 3. , 4. , 3.5, 3.5, 3.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5]], dtype=np.float32), + 'median') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.], + [3., 3., 3., 4., 3., 3., 3.], + [1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.]], dtype=np.float32), + 'minimum') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.]], dtype=np.float32), + 'reflect') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[4., 3., 3., 4., 4., 3., 3.], + [4., 3., 3., 4., 4., 3., 3.], + [2., 1., 1., 2., 2., 1., 1.], + [2., 1., 1., 2., 2., 1., 1.], + [4., 3., 3., 4., 4., 3., 3.], + [4., 3., 3., 4., 4., 3., 3.], + [2., 1., 1., 2., 2., 1., 1.]], dtype=np.float32), + 'symmetric') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.]], dtype=np.float32), + 'wrap') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.], + [0., 0., 1., 2., 0., 0., 0.], + [0., 0., 3., 4., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0.]], dtype=np.float32), + 'constant') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[-1., -1., -1., -1., -1., -1., -1.], + [-1., -1., -1., -1., -1., -1., -1.], + [-1., -1., -1., -1., -1., -1., -1.], + [-1., -1., 1., 2., -1., -1., -1.], + [-1., -1., 3., 4., -1., -1., -1.], + [-1., -1., -1., -1., -1., -1., -1.], + [-1., -1., -1., -1., -1., -1., -1.]], dtype=np.float32), + 'constant', constant_values=-1) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[-1., -1., -1., -1., -2., -2., -2.], + [-1., -1., -1., -1., -2., -2., -2.], + [-1., -1., -1., -1., -2., -2., -2.], + [-1., -1., 1., 2., -2., -2., -2.], + [-1., -1., 3., 4., -2., -2., -2.], + [-1., -1., -2., -2., -2., -2., -2.], + [-1., -1., -2., -2., -2., -2., -2.]], dtype=np.float32), + 'constant', constant_values=((-1, -2))) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[-3., -3., -1., -1., -4., -4., -4.], + [-3., -3., -1., -1., -4., -4., -4.], + [-3., -3., -1., -1., -4., -4., -4.], + [-3., -3., 1., 2., -4., -4., -4.], + [-3., -3., 3., 4., -4., -4., -4.], + [-3., -3., -2., -2., -4., -4., -4.], + [-3., -3., -2., -2., -4., -4., -4.]], dtype=np.float32), + 'constant', constant_values=((-1, -2), (-3, -4))) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [3., 3., 3., 4., 4., 4., 4.], + [3., 3., 3., 4., 4., 4., 4.], + [3., 3., 3., 4., 4., 4., 4.]], dtype=np.float32), + 'edge') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[0. , 0. , 0. , 0. , 0. , + 0. , 0. ], + [0. , 0.16666667, 0.33333334, 0.6666667 , 0.44444448, + 0.22222224, 0. ], + [0. , 0.33333334, 0.6666667 , 1.3333334 , 0.88888896, + 0.44444448, 0. ], + [0. , 0.5 , 1. , 2. , 1.3333334 , + 0.6666667 , 0. ], + [0. , 1.5 , 3. , 4. , 2.6666667 , + 1.3333334 , 0. ], + [0. , 0.75 , 1.5 , 2. , 1.3333334 , + 0.6666667 , 0. ], + [0. , 0. , 0. , 0. , 0. , + 0. , 0. ]], dtype=np.float32), + 'linear_ramp') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1. , 1. , 1. , 1. , 1. , 1. , + 1. ], + [1. , 1. , 1. , 1.3333334, 1.2222222, 1.1111112, + 1. ], + [1. , 1. , 1. , 1.6666667, 1.4444445, 1.2222222, + 1. ], + [1. , 1. , 1. , 2. , 1.6666667, 1.3333334, + 1. ], + [1. , 2. , 3. , 4. , 3. , 2. , + 1. ], + [1. , 1.5 , 2. , 2.5 , 2. , 1.5 , + 1. ], + [1. , 1. , 1. , 1. , 1. , 1. , + 1. ]], dtype=np.float32), + 'linear_ramp', end_values=1) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1. , 1. , 1. , 1. , 1.3333333, 1.6666666, + 2. ], + [1. , 1. , 1. , 1.3333334, 1.5555556, 1.7777778, + 2. ], + [1. , 1. , 1. , 1.6666667, 1.7777778, 1.888889 , + 2. ], + [1. , 1. , 1. , 2. , 2. , 2. , + 2. ], + [1. , 2. , 3. , 4. , 3.3333335, 2.6666667, + 2. ], + [1. , 1.75 , 2.5 , 3. , 2.6666667, 2.3333333, + 2. ], + [1. , 1.5 , 2. , 2. , 2. , 2. , + 2. ]], dtype=np.float32), + 'linear_ramp', end_values=(1, 2)) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[2. , 1.5 , 1. , 1. , 1. , 1. , + 1. ], + [2. , 1.5 , 1. , 1.3333334, 1.2222222, 1.1111112, + 1. ], + [2. , 1.5 , 1. , 1.6666667, 1.4444445, 1.2222222, + 1. ], + [2. , 1.5 , 1. , 2. , 1.6666667, 1.3333334, + 1. ], + [2. , 2.5 , 3. , 4. , 3. , 2. , + 1. ], + [2. , 2.25 , 2.5 , 3. , 2.3333335, 1.6666667, + 1. ], + [2. , 2. , 2. , 2. , 1.6666667, 1.3333334, + 1. ]], dtype=np.float32), + 'linear_ramp', end_values=((1, 2), (2, 1))) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.], + [2., 2., 1., 2., 2., 2., 2.], + [4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.], + [4., 4., 3., 4., 4., 4., 4.]], dtype=np.float32), + 'maximum') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [1.5, 1.5, 1. , 2. , 1.5, 1.5, 1.5], + [3.5, 3.5, 3. , 4. , 3.5, 3.5, 3.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5]], dtype=np.float32), + 'mean') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [1., 1., 1., 2., 2., 2., 2.], + [3., 3., 3., 4., 4., 4., 4.], + [3., 3., 3., 4., 4., 4., 4.], + [3., 3., 3., 4., 4., 4., 4.]], dtype=np.float32), + 'mean', stat_length=1) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1. , 1. , 1. , 2. , 1.5, 1.5, 1.5], + [1. , 1. , 1. , 2. , 1.5, 1.5, 1.5], + [1. , 1. , 1. , 2. , 1.5, 1.5, 1.5], + [1. , 1. , 1. , 2. , 1.5, 1.5, 1.5], + [3. , 3. , 3. , 4. , 3.5, 3.5, 3.5], + [2. , 2. , 2. , 3. , 2.5, 2.5, 2.5], + [2. , 2. , 2. , 3. , 2.5, 2.5, 2.5]], dtype=np.float32), + 'mean', stat_length=(1, 2)) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1.5, 1.5, 1. , 2. , 2. , 2. , 2. ], + [1.5, 1.5, 1. , 2. , 2. , 2. , 2. ], + [1.5, 1.5, 1. , 2. , 2. , 2. , 2. ], + [1.5, 1.5, 1. , 2. , 2. , 2. , 2. ], + [3.5, 3.5, 3. , 4. , 4. , 4. , 4. ], + [2.5, 2.5, 2. , 3. , 3. , 3. , 3. ], + [2.5, 2.5, 2. , 3. , 3. , 3. , 3. ]], dtype=np.float32), + 'mean', stat_length=((1, 2), (2, 1))) + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [1.5, 1.5, 1. , 2. , 1.5, 1.5, 1.5], + [3.5, 3.5, 3. , 4. , 3.5, 3.5, 3.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5], + [2.5, 2.5, 2. , 3. , 2.5, 2.5, 2.5]], dtype=np.float32), + 'median') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.], + [3., 3., 3., 4., 3., 3., 3.], + [1., 1., 1., 2., 1., 1., 1.], + [1., 1., 1., 2., 1., 1., 1.]], dtype=np.float32), + 'minimum') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.]], dtype=np.float32), + 'reflect') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[4., 3., 3., 4., 4., 3., 3.], + [4., 3., 3., 4., 4., 3., 3.], + [2., 1., 1., 2., 2., 1., 1.], + [2., 1., 1., 2., 2., 1., 1.], + [4., 3., 3., 4., 4., 3., 3.], + [4., 3., 3., 4., 4., 3., 3.], + [2., 1., 1., 2., 2., 1., 1.]], dtype=np.float32), + 'symmetric') + +test_pad(np.array([[1, 2], [3, 4]], np.float32), ((3, 2), (2, 3)), + np.array([[3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.], + [1., 2., 1., 2., 1., 2., 1.], + [3., 4., 3., 4., 3., 4., 3.]], dtype=np.float32), + 'wrap') + +test_pad([[[[1]]]], 1, + np.array([[[[2, 2, 2], + [2, 2, 2], + [2, 2, 2]], + [[2, 2, 2], + [2, 2, 2], + [2, 2, 2]], + [[2, 2, 2], + [2, 2, 2], + [2, 2, 2]]], + [[[2, 2, 2], + [2, 2, 2], + [2, 2, 2]], + [[2, 2, 2], + [2, 1, 2], + [2, 2, 2]], + [[2, 2, 2], + [2, 2, 2], + [2, 2, 2]]], + [[[2, 2, 2], + [2, 2, 2], + [2, 2, 2]], + [[2, 2, 2], + [2, 2, 2], + [2, 2, 2]], + [[2, 2, 2], + [2, 2, 2], + [2, 2, 2]]]]), 'constant', constant_values=2) + +test_pad([[[[1]]]], 0, np.array([[[[1]]]]), 'constant', constant_values=2) + ############# # searching # #############