在Python中使用最近邻使用给定的缩放因子来扩大2D数组



我正在尝试编写一个代码,使用最近邻算法在Python中使用给定的缩放因子来扩大2D数组。

例如,我有一个如下所示的数组:

[[1, 2],
[3, 4]]

我想做的是用NN算法和一个给定的缩放因子来扩大这个数组。

让我一步一步地解释。我们假设重标因子是3。放大后的数组应该如下所示:

[[1, 0, 0, 2, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[3, 0, 0, 4, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]

填充完空元素后,应该如下所示:

[[1, 1, 2, 2, 2, 2],
[1, 1, 2, 2, 2, 2],
[3, 3, 4, 4, 4, 4],
[3, 3, 4, 4, 4, 4],
[3, 3, 4, 4, 4, 4],
[3, 3, 4, 4, 4, 4]]

输出应该是这样的。(0,2)2而不是1,因为最近的邻居是2(0,3)而不是1(0,0)

我怎样才能做到这一点?

创建一个数组很容易,如下所示:

[[1, 1, 1, 2, 2, 2],
[1, 1, 1, 2, 2, 2], 
[1, 1, 1, 2, 2, 2], 
[3, 3, 3, 4, 4, 4], 
[3, 3, 3, 4, 4, 4], 
[3, 3, 3, 4, 4, 4]]

但这不是我想要的。

首先需要创建填充数组,但我们将用np.nan填充数组以用于下一步的插值。因为如果在填充之前已经有元素0,那么当我们用0s计算mask时,这将给我们一个错误的mask。下面是填充的函数:

def pad_data(arr,padlen):
m,n = arr.shape
out= np.empty((m*padlen, n*padlen)) * np.nan
for i in range(m):
for j in range(n):
out[i*padlen, j*padlen] = arr[i,j]
return out

然后我们需要在scipy中使用NearestNDInterpolator进行最近的插值。完整代码如下:

import numpy as np
from scipy.interpolate import NearestNDInterpolator
def pad_data(arr,padlen):
m,n = arr.shape
out= np.empty((m*padlen, n*padlen)) * np.nan
for i in range(m):
for j in range(n):
out[i*padlen, j*padlen] = arr[i,j]
return out

arr = np.array([[1, 2],[3, 4]])
arr_pad = pad_data(arr,3)
mask = np.where(~np.isnan(arr_pad))
interp = NearestNDInterpolator(np.transpose(mask), arr_pad[mask])
filled_data = interp(*np.indices(arr_pad.shape))
filled_data

给出:

array([[1., 1., 2., 2., 2., 2.],
[1., 1., 2., 2., 2., 2.],
[3., 3., 4., 4., 4., 4.],
[3., 3., 4., 4., 4., 4.],
[3., 3., 4., 4., 4., 4.],
[3., 3., 4., 4., 4., 4.]])

最新更新