如何将数组上采样到任意大小?

How to upsample an array to arbitrary sizes?

我正在尝试通过将每个元素按比例重复到新大小来将 Python 中的数组调整为更大的大小。但是,我希望能够调整为任意大小。

我知道我可以用 numpy.repeat 做到这一点,例如,如果我必须将大小加倍,但假设我想将大小为 (180,150) 的数组转换为 (300,250)。我知道没有完美的方法可以做到这一点,但我正在寻找最有效(信息损失最少)的方法!

到目前为止,我正在将数组转换为图像并相应地调整其大小,然后再次将其转换为数组。但是,似乎我无法将所有类型的数据都转换为图像,所以我需要一个通用的方法来做到这一点。

例如,假设我有一个大小为 (2,2):

的输入数组

input_array=np.array([[1,2],[3,4]])

如果我想将它转换为 (3,3) 数组,输出可能是这样的:

output_array=np.array([[1,1,2],[1,1,2],[3,3,4]])

就像我之前说的,我只是不想平铺或填充零,我想通过重复一些元素来扩大尺寸。

如果不清楚您想要达到的最终结果,您的问题会打开多个路径和解决方案。仅举几例:

  1. 使用numpy.resize:
import numpy as np

input_array=np.array([[1.,2],[3,4]])

np.resize(input_array, (3,3))

你得到:

array([[1., 2., 3.],
       [4., 1., 2.],
       [3., 4., 1.]])
  1. 使用cv2.resize:
import cv2
import numpy as np

input_array=np.array([[1.,2],[3,4]])

cv2.resize(input_array,
           (3,3),
           interpolation=cv2.INTER_NEAREST)

你得到:

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

根据您的objective,您可以使用不同的插值方法。

如果您寻找纯 numpy 解决方案,那么您可以尝试使用花式索引:

outshape = 3,3
rows = np.linspace(0, input_array.shape[0], endpoint=False, num=outshape[0], dtype=int)
cols = np.linspace(0, input_array.shape[1], endpoint=False, num=outshape[1], dtype=int)
# Extract result using compute indices
output_array=input_array[rows,:][:,cols]