【问题标题】:scipy.ndimage.interpolation shift of numpy array gives erroneous result - bug?numpy 数组的 scipy.ndimage.interpolation 移位给出错误的结果 - 错误?
【发布时间】:2019-10-29 23:43:10
【问题描述】:

这个问题是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 中的一个错误

【问题讨论】:

    标签: python numpy scipy shift


    【解决方案1】:

    这不是错误。 According to the docs,它使用 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.     ]]])
    

    【讨论】:

    • 啊啊啊——明白了。非常感谢你。我真的很感激。
    • @codingknob 不客气。也接受其他形式的欣赏:P
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2011-11-15
    • 2019-02-06
    • 2014-01-30
    • 2018-08-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多