我有一个非常简单的问题 -
我正在寻找一种方法来插入我存储在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数组。
答案 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. ]]])