簡體   English   中英

使用傅里葉變換方法對二維數組進行重采樣

[英]Resampling 2-d array using Fourier transform method

我對重采樣二維數組有疑問。
有時,地球科學數據的原始大小應轉換為其他大小。 如果每個軸的比率相等,則任務很簡單,其中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 數組為 output

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

數據丟失很嚴重。 因此,我在這里發布了我的問題。 也許我使用的重采樣 function 不正確。 或者有一些更好的方法來處理這種情況。 任何建議或意見都非常感謝!

當您自己設置“粗略數組”時,您對相鄰條目求和,而不是計算平均值或插值。

這樣,粗略數組和原始數組中所有元素的總和是相同的str((coarse_pop.sum()-pop.sum())/(0.5*(pop.sum()+coarse_pop.sum())))給出'-1.1638426077573779e-16'只是一個微小的數字錯誤。

如果您比較 fftpack 重采樣粗略數組的平均值,則它匹配: print(pop.mean()) print(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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM