python - 插入一个 numpy 数组以适应另一个数组

标签 python arrays numpy interpolation

假设我有形状为 (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"')

结果图:

result

在图中,蓝色圆圈是原始数据点,红色方 block 是插值数据点(它们在边界处重叠)。如您所见,我所说的压缩和拉伸(stretch)实际上是底层(默认为线性)函数的上采样和下采样。这就是为什么我说你必须非常小心插值:如果你的期望与你的数据不匹配,你可能会得到非常错误的结果。

关于python - 插入一个 numpy 数组以适应另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38064697/

相关文章:

python - 如何将实例变量传递给类定义内的装饰器?

python - 合并 Pandas Dataframe 中的列

python - 使用嵌套 for 循环比较不同的 Pandas 数据帧

c++ - 指向更大 unsigned char 数组的每个第 n 个元素的指针数组

python - 为什么后面的操作数不能一起广播?

python - 使用 RNN 和 Layer 类在 Keras 中实现最小的 LSTMCell

php - 只处理以特定字符串开头的 $_POST 元素

java - 如何在java中的char上使用.set()或.setvalue()

python - 创建随机字母数组 : Python 3

python - 带有 float 的 Numpy bincount()