Ресэмплирование двумерного массива с использованием метода преобразования Фурье - PullRequest
0 голосов
/ 19 октября 2019

У меня вопрос по массиву 2-d передискретизации.
Иногда исходный размер данных геонауки следует преобразовать в другой размер. Если отношение для каждой оси равно, задача проста, в которой 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

Потеря данных была значительной. Таким образом, я разместил свою проблему здесь. Возможно, функция повторной выборки, которую я использовал, была неправильной. Или есть какой-то лучший подход для решения этой ситуации. Любые советы или комментарии высоко ценятся!

1 Ответ

2 голосов
/ 19 октября 2019

Когда вы устанавливаете «грубый массив» самостоятельно, вы суммируете по смежным элементам вместо вычисления среднего или интерполяционного.

Таким образом, сумма по всем элементам в грубом и исходном массиве идентична str((coarse_pop.sum()-pop.sum())/(0.5*(pop.sum()+coarse_pop.sum()))) дает '-1.1638426077573779e-16' только крошечную числовую ошибку.

, если вы сравните среднее значение грубого массива famppack с повторной выборкой, которому он соответствует: 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))

...