Fix np.pad() casting

pull/629/head
A. R. Shajii 2025-02-11 15:49:15 -05:00
parent b58b1ee767
commit f1ab7116d8
3 changed files with 399 additions and 5 deletions

View File

@ -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

View File

@ -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)

View File

@ -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 #
#############