使用傅立叶变换方法重采样二维数组

问题描述 投票:0回答:1

我对重采样二维数组有疑问。有时,地球科学数据的原始大小应转换为其他大小。如果每个轴的比率相等,则任务很简单,其中np.reshape允许100x100至50x50的二维数组而不会丢失数据。代码显示为:

## creat a original data 
xc1, xc2, yc1, yc2 = 100, 110, 35, 45
XSIZE,YSIZE=100,100
lon,lat  = np.linspace(xc1,xc2,XSIZE),np.linspace(yc1,yc2,YSIZE)
pop = np.random.uniform(low=1000, high=50000, size=(XSIZE*YSIZE,)).reshape(YSIZE,XSIZE)

## reshape
shape = np.array(pop.shape, dtype=float)
coarseness = 2 # the new shape is in 50 x 50
new_shape = coarseness * np.ceil(shape/coarseness).astype(int)
zp_pop = np.zeros(new_shape)
zp_pop[:int(shape[0]), :int(shape[1])] = pop
temp = zp_pop.reshape((new_shape[0] // coarseness, coarseness,
                                new_shape[1] // coarseness, coarseness))
coarse_pop = np.sum(temp, axis=(1,3))
print (pop.sum())
print (coarse_pop.sum())

但是,当每个轴的粗略因子不同时,则无法实现此方法。我转而应用其他方法。这是我尝试使用FFT生成60 * 80数组作为输出的示例

from scipy import fftpack
pop_fft = fftpack.fft2(pop,shape = (60,80))
pop_res = fftpack.ifft2(pop_fft).real

print(pop.sum())
print(pop_res.sum())
254208134.8356425
122048754.13639387

数据丢失很大。因此,我在这里发布了我的问题。也许我使用的重采样功能不正确。或者有一些更好的方法来处理这种情况。任何建议或评论都将受到高度赞赏!

python arrays image gis fft
1个回答
0
投票

当您自己设置'粗阵列'时,您将对相邻条目求和,而不是计算平均值或内插。

这样,粗数组和原始数组中所有元素的总和相同str((coarse_pop.sum()-pop.sum())/(0.5*(pop.sum()+coarse_pop.sum())))仅使'-1.1638426077573779e-16'产生很小的数值误差。

如果比较fftpack重采样的粗糙数组的平均值,则它匹配:打印(pop.mean())打印(pop_res.mean())

25606.832220313503
25496.03271480075

或者,您可以自己校正元素的数量:

print(pop.sum())
print(pop_res.sum()*100*100/(60*80))

256068322.20313504
254960327.14800745

我不知道您的问题,但是对数组进行下采样的fftpack方法对我来说更有意义。如果不是您想要的,可以将预因子应用于原始数组,例如pop_fft = fftpack.fft2(pop*100*100/(60*80),shape = (60,80))

© www.soinside.com 2019 - 2024. All rights reserved.