我需要线性插入一个nx3x3维度的numpy数组

时间:2016-03-10 23:46:18

标签: python arrays numpy matrix interpolation

我有一个非常简单的问题 -

我正在寻找一种方法来插入我存储在3D numpy数组中的一堆3x3矩阵。基本上我需要重新填充一个numpy数组,其中间矩阵值只是基于行/列中的每个元素线性计算。

转向的东西 [[1 1 1], [1 1 1], [1 1 1]](即2x3x3 np.array)
[[5 5 5], [5 5 5], [5 5 5]]

[[1 1 1], [1 1 1], [1 1 1]]
[[3 3 3], [3 3 3], [3 3 3]](即3x3x3 np.array)
[[5 5 5], [5 5 5], [5 5 5]]

但每个矩阵之间需要大约一百个矩阵,然后存储回我的Nx [3x3] numpy数组。

1 个答案:

答案 0 :(得分:0)

您可以使用scipy.interpolate.interp1d

在以下示例中,a是一个形状为(4,3,3)的数组。插值结果b具有形状(13,3,3)。

import numpy as np
from scipy.interpolate import interp1d

a = np.empty((4, 3, 3))
a[0, :, :] = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
a[1, :, :] = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
a[2, :, :] = [[1, 1, 1], [1, 2, 3], [10, 20, 30]]
a[3, :, :] = [[5, 5, 5], [3, 4, 5], [20, 40, 60]]

# Create an x-coordinate for each 3x3 array in `a`.
x = np.arange(a.shape[0])

# Create a linear interpolator.
f = interp1d(x, a, axis=0)

# Insert `m` arrays between each 3x3 array in `a`.
m = 3
xx = np.linspace(x[0], x[-1], (a.shape[0] - 1)*(m + 1) + 1)
b = f(xx)

以下是在ipython会话中运行脚本后的一些值:

In [93]: a
Out[93]: 
array([[[  0.,   0.,   0.],
        [  0.,   0.,   0.],
        [  0.,   0.,   0.]],

       [[  1.,   1.,   1.],
        [  1.,   1.,   1.],
        [  1.,   1.,   1.]],

       [[  1.,   1.,   1.],
        [  1.,   2.,   3.],
        [ 10.,  20.,  30.]],

       [[  5.,   5.,   5.],
        [  3.,   4.,   5.],
        [ 20.,  40.,  60.]]])

In [94]: x
Out[94]: array([0, 1, 2, 3])

In [95]: xx
Out[95]: 
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ,
        2.25,  2.5 ,  2.75,  3.  ])

In [96]: b[:5]
Out[96]: 
array([[[ 0.  ,  0.  ,  0.  ],
        [ 0.  ,  0.  ,  0.  ],
        [ 0.  ,  0.  ,  0.  ]],

       [[ 0.25,  0.25,  0.25],
        [ 0.25,  0.25,  0.25],
        [ 0.25,  0.25,  0.25]],

       [[ 0.5 ,  0.5 ,  0.5 ],
        [ 0.5 ,  0.5 ,  0.5 ],
        [ 0.5 ,  0.5 ,  0.5 ]],

       [[ 0.75,  0.75,  0.75],
        [ 0.75,  0.75,  0.75],
        [ 0.75,  0.75,  0.75]],

       [[ 1.  ,  1.  ,  1.  ],
        [ 1.  ,  1.  ,  1.  ],
        [ 1.  ,  1.  ,  1.  ]]])

In [97]: b[-5:]
Out[97]: 
array([[[  1. ,   1. ,   1. ],
        [  1. ,   2. ,   3. ],
        [ 10. ,  20. ,  30. ]],

       [[  2. ,   2. ,   2. ],
        [  1.5,   2.5,   3.5],
        [ 12.5,  25. ,  37.5]],

       [[  3. ,   3. ,   3. ],
        [  2. ,   3. ,   4. ],
        [ 15. ,  30. ,  45. ]],

       [[  4. ,   4. ,   4. ],
        [  2.5,   3.5,   4.5],
        [ 17.5,  35. ,  52.5]],

       [[  5. ,   5. ,   5. ],
        [  3. ,   4. ,   5. ],
        [ 20. ,  40. ,  60. ]]])