Смещение scipy.ndimage.interpolation массива Numpy дает ошибочный результат - ошибка? - PullRequest
1 голос
/ 30 октября 2019

Этот вопрос является расширением смещения массива numpy на строку

Если I shift (из scipy.ndimage.interpolation) с использованием тестового массива 3 x 5 x 5, так что все работаеткак и ожидалось:

arr = np.ones([3,5,5])

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.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.]]])

shift(arr,(1,0,0), cval=np.nan)

array([[[ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan]],

       [[  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.]],

       [[  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.],
        [  1.,   1.,   1.,   1.,   1.]]])

ОДНАКО, если я выполню тот же сдвиг для массива данных 3 x 5 x 5, я получу все значения np.nan:

array([[[ 0.        ,         nan,         nan,         nan,         nan],
        [        nan,  0.        ,         nan,         nan, -1.07346633],
        [        nan,         nan,  0.        ,         nan,         nan],
        [        nan,         nan,         nan,  0.        ,         nan],
        [        nan,  1.07346633,         nan,         nan,  0.        ]],

       [[ 0.        ,         nan,         nan,         nan,         nan],
        [        nan,  0.        ,         nan,         nan,         nan],
        [        nan,         nan,  0.        , -1.44470265,         nan],
        [        nan,         nan,  1.44470265,  0.        ,         nan],
        [        nan,         nan,         nan,         nan,  0.        ]],

       [[ 0.        ,         nan,  1.80965682,         nan,         nan],
        [        nan,  0.        ,         nan,         nan,         nan],
        [-1.80965682,         nan,  0.        ,         nan,         nan],
        [        nan,         nan,         nan,  0.        ,         nan],
        [        nan,         nan,         nan,         nan,  0.        ]]])

shift(stats1_arr,(1,0,0), cval=np.nan)

array([[[ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan]],

       [[ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan]],

       [[ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan],
        [ nan,  nan,  nan,  nan,  nan]]])

Я что-то делаюнеправильно (неправильно использует shift?) или это ошибка? Похоже, ошибка в scipy.ndimage.interpolation.shift

1 Ответ

1 голос
/ 30 октября 2019

Это не ошибка. Согласно документам , используется сплайн-интерполяция порядка 3 (по умолчанию), и ваша разреженная матрица просто заканчивается полными np.nan значениями, потому что вы не можете ее интерполировать.

Вы можете существенно отключить «функцию» интерполяции, используя order=0:

shift(stats1_arr, (1, 0, 0), cval=np.nan, order=0)

Что приводит к:

array([[[     nan,      nan,      nan,      nan,      nan],
        [     nan,      nan,      nan,      nan,      nan],
        [     nan,      nan,      nan,      nan,      nan],
        [     nan,      nan,      nan,      nan,      nan],
        [     nan,      nan,      nan,      nan,      nan]],

       [[ 0.     ,      nan,      nan,      nan,      nan],
        [     nan,  0.     ,      nan,      nan, -1.07347],
        [     nan,      nan,  0.     ,      nan,      nan],
        [     nan,      nan,      nan,  0.     ,      nan],
        [     nan,  1.07347,      nan,      nan,  0.     ]],

       [[ 0.     ,      nan,      nan,      nan,      nan],
        [     nan,  0.     ,      nan,      nan,      nan],
        [     nan,      nan,  0.     , -1.4447 ,      nan],
        [     nan,      nan,  1.4447 ,  0.     ,      nan],
        [     nan,      nan,      nan,      nan,  0.     ]]])
...