【发布时间】:2018-08-23 03:21:08
【问题描述】:
当使用scipy.ndimage.interpolation.shift 沿一个带有周期性边界处理 (mode = 'wrap') 的轴移动一个 numpy 数据数组时,我得到了一个意想不到的行为。该例程尝试强制第一个像素 (index 0) 与最后一个像素 (index N-1) 相同,而不是“最后一个像素 (index N)”。
小例子:
# module import
import numpy as np
from scipy.ndimage.interpolation import shift
import matplotlib.pyplot as plt
# print scipy.__version__
# 0.18.1
a = range(10)
plt.figure(figsize=(16,12))
for i, shift_pix in enumerate(range(10)):
# shift the data via spline interpolation
b = shift(a, shift=shift_pix, mode='wrap')
# plotting the data
plt.subplot(5,2,i+1)
plt.plot(a, marker='o', label='data')
plt.plot(np.roll(a, shift_pix), marker='o', label='data, roll')
plt.plot(b, marker='o',label='shifted data')
if i == 0:
plt.legend(loc=4,fontsize=12)
plt.ylim(-1,10)
ax = plt.gca()
ax.text(0.10,0.80,'shift %d pix' % i, transform=ax.transAxes)
蓝线:班次前的数据
绿线:预期的换档行为
红线:scipy.ndimage.interpolation.shift的实际移位输出
在我如何调用函数或我如何理解 mode = 'wrap' 的行为方面是否有一些错误?当前结果与来自相关scipy tutorial page 和另一个StackOverflow post 的模式参数描述形成对比。代码中是否存在错误?
使用的 Scipy 版本是 0.18.1,分布在 anaconda-2.2.0
【问题讨论】:
-
使用的Scipy版本是0.18.1,分布在anaconda-2.2.0
-
不要评论添加说明,而是编辑(注意:已经为你做过)
-
看起来
shift()在数据移动后执行了边界条件。因此,当 shift_pix 为 1 时,它将a转换为[0, 1, 2, 3, 4, 5, 6, 7, 8],然后 然后 进行换行,将8带到前面。我不知道它为什么会这样。 -
@ArthurDent:我不确定事实是否如此。请注意,输出值为
[8, 1, 2, 3, 4, 5, 6, 7, 8, 9]。如果我理解正确你的建议,那么包装宁愿给[8, 0, 1, 2, 3, 4, 5, 6, 7, 8]。 -
@bproxauf
[8, 0, 1, 2, 3, 4, 5, 6, 7, 8]不是你得到的吗?第二个图中移位数据的第二个元素等于 0,而不是 1。当我执行b = shift(a, shift=1, mode='wrap')时,它会产生[8, 0, 1, 2, 3, 4, 5, 6, 7, 8]。此外,我花在查看 shift 函数源代码上的时间比我愿意承认的要多,但它是用 C 语言编写的,对我来说有点太复杂了,无法解读。据我所知,它看起来应该首先执行换行,但我不能确定。如果你想看,请告诉我。
标签: python scipy interpolation ndimage