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. ]]])
这个问题是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
:
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. ]]])