如何将数组上采样到任意大小?
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]])
就像我之前说的,我只是不想平铺或填充零,我想通过重复一些元素来扩大尺寸。
如果不清楚您想要达到的最终结果,您的问题会打开多个路径和解决方案。仅举几例:
- 使用
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.]])
- 使用
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]
我正在尝试通过将每个元素按比例重复到新大小来将 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]])
就像我之前说的,我只是不想平铺或填充零,我想通过重复一些元素来扩大尺寸。
如果不清楚您想要达到的最终结果,您的问题会打开多个路径和解决方案。仅举几例:
- 使用
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.]])
- 使用
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]