Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python沿列插值二维矩阵_Python_Numpy_Matrix_Interpolation - Fatal编程技术网

使用Python沿列插值二维矩阵

使用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]

我试图将一个二维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]
  [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是的,没错!我再次更新了我的问题。很抱歉对这个问题进行了糟糕的描述。