假设我有形状为 (1, n)
的 some_data
。我有形状为 (1, n±x)
的新 incoming_data
,其中 x 是比 n
小得多的正整数。我想压缩或拉伸(stretch) incoming_data
,使其与 n
的长度相同。如何使用 SciPy 堆栈完成此操作?
这是我正在尝试完成的示例。
# Stretch arr2 to arr1's shape while "filling in" interpolated value
arr1 = np.array([1, 5, 2, 3, 7, 2, 1])
arr2 = np.array([1, 5, 2, 3, 7, 1])
result
> np.array([1, 5, 2, 3, 6.x, 2.x 1]) # of shape (arr1.shape)
再举个例子:
# Squeeze arr2 to arr1's shape while placing interpolated value.
arr1 = np.array([1, 5, 2, 3, 7, 2, 1])
arr2 = np.array([1, 5, 2, 3, 4, 7, 2, 1])
result
> np.array([1, 5, 2, 3.x, 7.x, 2.x, 1]) # of shape (arr1.shape)
最佳答案
您可以使用 scipy.interpolate.interp1d
实现这种简单的数据压缩或拉伸(stretch)。 .我并不是说它一定有意义(你使用的插值类型有很大的不同,如果你能正确猜测底层函数的行为,你通常只会得到一个合理的结果),但你可以做吧。
想法是将原始数组插入其索引作为 x
值,然后使用更稀疏的 x
网格执行插值,同时保持其端点相同。所以基本上你必须对你的离散数据进行连续近似,并在必要的点重新采样:
import numpy as np
import scipy.interpolate as interp
import matplotlib.pyplot as plt
arr_ref = np.array([1, 5, 2, 3, 7, 1]) # shape (6,), reference
arr1 = np.array([1, 5, 2, 3, 7, 2, 1]) # shape (7,), to "compress"
arr2 = np.array([1, 5, 2, 7, 1]) # shape (5,), to "stretch"
arr1_interp = interp.interp1d(np.arange(arr1.size),arr1)
arr1_compress = arr1_interp(np.linspace(0,arr1.size-1,arr_ref.size))
arr2_interp = interp.interp1d(np.arange(arr2.size),arr2)
arr2_stretch = arr2_interp(np.linspace(0,arr2.size-1,arr_ref.size))
# plot the examples, assuming same x_min, x_max for all data
xmin,xmax = 0,1
fig,(ax1,ax2) = plt.subplots(ncols=2)
ax1.plot(np.linspace(xmin,xmax,arr1.size),arr1,'bo-',
np.linspace(xmin,xmax,arr1_compress.size),arr1_compress,'rs')
ax2.plot(np.linspace(xmin,xmax,arr2.size),arr2,'bo-',
np.linspace(xmin,xmax,arr2_stretch.size),arr2_stretch,'rs')
ax1.set_title('"compress"')
ax2.set_title('"stretch"')
结果图:
在图中,蓝色圆圈是原始数据点,红色方 block 是插值数据点(它们在边界处重叠)。如您所见,我所说的压缩和拉伸(stretch)实际上是底层(默认为线性)函数的上采样和下采样。这就是为什么我说你必须非常小心插值:如果你的期望与你的数据不匹配,你可能会得到非常错误的结果。
关于python - 插入一个 numpy 数组以适应另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38064697/