使用线性插值调整numpy ndarray大小

3 投票
1 回答
4618 浏览
提问于 2025-04-17 22:17

假设我想把一个形状为 (100,100,100) 的数组调整成形状为 (57,57,57) 的数组,使用线性插值的方法。

基本上,我需要一个函数,它可以接受一个维度为 n 的数组,形状为 S,然后把它转换成一个维度相同但形状为 S' 的数组,过程中使用插值的方法。

有没有简单又快速的方法可以用 numpy 和 scipy 来实现这个?我看到有一些一维插值、二维插值、网格插值的东西,但它们需要线性空间之类的,我不是很明白这些是什么意思。

1 个回答

3

你可以使用scipy.interpolate里的griddata方法。

from scipy.interpolate import griddata

假设你的三维数组是这样的:

array3d

你需要调整一下你的数据格式,并创建一个包含原始索引或点坐标的数组。

N=100
array3DAux = array3D.reshape(N**3)

# ijk is an (N**3,3) array with the indexes of the reshaped array.
ijk = mgrid[0:N,0:N,0:N].reshape(3,N**3).T

现在你可以创建一个新的网格,用来找到新的插值点。

#In your case 57 points
n = 57j
i,j,k = mgrid[0:N:n,0:N:n,0:N:n]

这里有三种插值方法:最近邻、线性和立方插值,具体如下:

newArray3D_z0 = griddata(ijk,array3DAux,(i,j,k),method="nearest")
newArray3D_z1 = griddata(ijk,array3DAux,(i,j,k),method="linear")
newArray3D_z2 = griddata(ijk,array3DAux,(i,j,k),method="cubic")

在这种情况下,它可以用来缩小或放大你的三维数组的大小。

希望这对你有帮助。

撰写回答