scipy.ndimage.interpolation numpy 数组的移位给出了错误的结果 - 错误?

scipy.ndimage.interpolation shift of numpy array gives erroneous result - bug?

这个问题是shift numpy array by row

的延伸

如果我 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

中的错误

这不是错误。 According to the docs,它使用 3 阶样条插值(默认情况下),并且您的稀疏矩阵最终充满了 np.nan 值,因为您无法真正对其进行插值。

您基本上可以使用 order=0:

关闭插值 'feature'
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.     ]]])