使用Python沿列插值二维矩阵
我试图将一个二维numpy矩阵(5,3)插值为一个沿轴1(列)的矩阵(7,3)。显然,错误的方法是在原始矩阵之间的任意位置随机插入行,请参见以下示例:使用Python沿列插值二维矩阵,python,numpy,matrix,interpolation,Python,Numpy,Matrix,Interpolation,我试图将一个二维numpy矩阵(5,3)插值为一个沿轴1(列)的矩阵(7,3)。显然,错误的方法是在原始矩阵之间的任意位置随机插入行,请参见以下示例: Source: [[0, 1, 1] [0, 2, 0] [0, 3, 1] [0, 4, 0] [0, 5, 1]] Target (terrible interpolation -> not wanted!): [[0, 1, 1] [0, 1.5, 0.5] [0, 2, 0] [0, 3, 1]
Source:
[[0, 1, 1]
[0, 2, 0]
[0, 3, 1]
[0, 4, 0]
[0, 5, 1]]
Target (terrible interpolation -> not wanted!):
[[0, 1, 1]
[0, 1.5, 0.5]
[0, 2, 0]
[0, 3, 1]
[0, 3.5, 0.5]
[0, 4, 0]
[0, 5, 1]]
Source:
[[0, 1, 1]
[0, 2, 0]
[0, 3, 1]
[0, 4, 0]
[0, 5, 1]]
Split into 3 separate Columns:
[0 [1 [1
0 2 0
0 3 1
0 4 0
0] 5] 1]
Expand length to 7 and interpolate between them, example for second column:
[1
1.66
2.33
3
3.66
4.33
5]
正确的方法是考虑每一行,并在所有行之间插值,以将源矩阵扩展为(7,3)矩阵。我知道scipy.interpolate.interp1d或scipy.interpolate.interp2d方法,但无法将其用于其他堆栈溢出帖子或网站。我希望收到任何类型的提示或技巧
更新#1:预期值应等距分布
更新#2:
我想做的基本上是使用原始矩阵的独立列,将列的长度扩展为7,并在原始列的值之间进行插值。请参见以下示例:
Source:
[[0, 1, 1]
[0, 2, 0]
[0, 3, 1]
[0, 4, 0]
[0, 5, 1]]
Target (terrible interpolation -> not wanted!):
[[0, 1, 1]
[0, 1.5, 0.5]
[0, 2, 0]
[0, 3, 1]
[0, 3.5, 0.5]
[0, 4, 0]
[0, 5, 1]]
Source:
[[0, 1, 1]
[0, 2, 0]
[0, 3, 1]
[0, 4, 0]
[0, 5, 1]]
Split into 3 separate Columns:
[0 [1 [1
0 2 0
0 3 1
0 4 0
0] 5] 1]
Expand length to 7 and interpolate between them, example for second column:
[1
1.66
2.33
3
3.66
4.33
5]
似乎可以完全独立地处理每一列,但对于每一列,基本上需要定义一个“x”坐标,以便可以拟合某个函数“f(x)”,从而生成输出矩阵。 除非矩阵中的行与其他数据结构(例如,时间戳向量)相关联,否则一组明显的x值就是行号:
x = numpy.arange(0, Source.shape[0])
然后可以构造插值函数:
fit = scipy.interpolate.interp1d(x, Source, axis=0)
并用它来构建输出矩阵:
Target = fit(numpy.linspace(0, Source.shape[0]-1, 7)
产生:
array([[ 0. , 1. , 1. ],
[ 0. , 1.66666667, 0.33333333],
[ 0. , 2.33333333, 0.33333333],
[ 0. , 3. , 1. ],
[ 0. , 3.66666667, 0.33333333],
[ 0. , 4.33333333, 0.33333333],
[ 0. , 5. , 1. ]])
默认情况下,scipy.interpolate.interp1d使用分段线性插值。基于高阶多项式等,内部有许多更奇特的选项。插值本身就是一个大主题,除非矩阵的行具有某些特定属性(例如,具有已知频率范围的信号的常规样本),否则可能没有“真正正确”的插值方法。因此,在某种程度上,插值方案的选择会有些随意。似乎可以完全独立地处理每一列,但对于每一列,您需要定义一个“x”坐标,以便可以拟合某个函数“f(x)”,从中生成输出矩阵。 除非矩阵中的行与其他数据结构(例如,时间戳向量)相关联,否则一组明显的x值就是行号:
x = numpy.arange(0, Source.shape[0])
然后可以构造插值函数:
fit = scipy.interpolate.interp1d(x, Source, axis=0)
并用它来构建输出矩阵:
Target = fit(numpy.linspace(0, Source.shape[0]-1, 7)
产生:
array([[ 0. , 1. , 1. ],
[ 0. , 1.66666667, 0.33333333],
[ 0. , 2.33333333, 0.33333333],
[ 0. , 3. , 1. ],
[ 0. , 3.66666667, 0.33333333],
[ 0. , 4.33333333, 0.33333333],
[ 0. , 5. , 1. ]])
默认情况下,scipy.interpolate.interp1d使用分段线性插值。基于高阶多项式等,内部有许多更奇特的选项。插值本身就是一个大主题,除非矩阵的行具有某些特定属性(例如,具有已知频率范围的信号的常规样本),否则可能没有“真正正确”的插值方法。因此,在某种程度上,插值方案的选择会有些随意。您可以按如下方式进行:
from scipy.interpolate import interp1d
import numpy as np
a = np.array([[0, 1, 1],
[0, 2, 0],
[0, 3, 1],
[0, 4, 0],
[0, 5, 1]])
x = np.array(range(a.shape[0]))
# define new x range, we need 7 equally spaced values
xnew = np.linspace(x.min(), x.max(), 7)
# apply the interpolation to each column
f = interp1d(x, a, axis=0)
# get final result
print(f(xnew))
这会打印出来
[[ 0. 1. 1. ]
[ 0. 1.66666667 0.33333333]
[ 0. 2.33333333 0.33333333]
[ 0. 3. 1. ]
[ 0. 3.66666667 0.33333333]
[ 0. 4.33333333 0.33333333]
[ 0. 5. 1. ]]
您可以按如下方式执行此操作:
from scipy.interpolate import interp1d
import numpy as np
a = np.array([[0, 1, 1],
[0, 2, 0],
[0, 3, 1],
[0, 4, 0],
[0, 5, 1]])
x = np.array(range(a.shape[0]))
# define new x range, we need 7 equally spaced values
xnew = np.linspace(x.min(), x.max(), 7)
# apply the interpolation to each column
f = interp1d(x, a, axis=0)
# get final result
print(f(xnew))
这会打印出来
[[ 0. 1. 1. ]
[ 0. 1.66666667 0.33333333]
[ 0. 2.33333333 0.33333333]
[ 0. 3. 1. ]
[ 0. 3.66666667 0.33333333]
[ 0. 4.33333333 0.33333333]
[ 0. 5. 1. ]]
你好很抱歉,但我无法提供预期的结果,因为这正是我试图通过此任务实现的目标。我只是不知道如何解决这个问题。问题还不清楚:可能存在无穷多个解,因此您需要指定要查找的7个值(例如,它们是否应等距分布,如果不是,两个缺少的值应按哪个标准添加等)。此外,列是否应相互独立地插值?好,这些列应该相互独立地插值?像这样<代码>[[0,0,0],[0,1,1],[0,2,0],[0,3,1],[0,4,0],[0,5,1],[0,6,0]]所有代码都“等距排列”。@Cleb是的,没错!我再次更新了我的问题。很抱歉对问题进行了糟糕的描述。嗨!很抱歉,但我无法提供预期的结果,因为这正是我试图通过此任务实现的目标。我只是不知道如何解决这个问题。问题还不清楚:可能存在无穷多个解,因此您需要指定要查找的7个值(例如,它们是否应等距分布,如果不是,两个缺少的值应按哪个标准添加等)。此外,列是否应相互独立地插值?好,这些列应该相互独立地插值?像这样<代码>[[0,0,0],[0,1,1],[0,2,0],[0,3,1],[0,4,0],[0,5,1],[0,6,0]]所有代码都“等距排列”。@Cleb是的,没错!我再次更新了我的问题。很抱歉对这个问题进行了糟糕的描述。