numpy.fft.irfft: Почему необходим len (a)? - PullRequest
0 голосов
/ 01 октября 2018

Документация для numpy.fft.irfft, обратное дискретное преобразование Фурье для реального ввода, состояний

Эта функция вычисляет инверсию одномерного n-точечного дискретного ФурьеПреобразование реального ввода вычисляется как rfft.Другими словами, irfft(rfft(a), len(a)) == a с точностью до числовой.(См. Примечания ниже о том, почему len(a) необходимо здесь.)

Однако в разделе «Примечания», похоже, не указывается, почему в этом случае необходимо было бы указать len(a).Действительно, кажется, что все работает правильно, даже если опустить длину:

numpy.random.seed(123456)
a = numpy.random.rand(20)
# array([0.12696983, 0.96671784, 0.26047601, 0.89723652, 0.37674972,
#        0.33622174, 0.45137647, 0.84025508, 0.12310214, 0.5430262 ,
#        0.37301223, 0.44799682, 0.12944068, 0.85987871, 0.82038836,
#        0.35205354, 0.2288873 , 0.77678375, 0.59478359, 0.13755356])
numpy.fft.irfft(numpy.fft.rfft(a))
# array([0.12696983, 0.96671784, 0.26047601, 0.89723652, 0.37674972,
#        0.33622174, 0.45137647, 0.84025508, 0.12310214, 0.5430262 ,
#        0.37301223, 0.44799682, 0.12944068, 0.85987871, 0.82038836,
#        0.35205354, 0.2288873 , 0.77678375, 0.59478359, 0.13755356])

Могу ли я пропустить len(a) в моем вызове numpy.fft.rfft?

1 Ответ

0 голосов
/ 25 июля 2019

Как указано в комментариях, пропуск длины работает, если длина четная, но не, если она нечетная:

numpy.random.seed(123456)
a = numpy.random.rand(21)
# array([0.12696983, 0.96671784, 0.26047601, 0.89723652, 0.37674972,
#        0.33622174, 0.45137647, 0.84025508, 0.12310214, 0.5430262 ,
#        0.37301223, 0.44799682, 0.12944068, 0.85987871, 0.82038836,
#        0.35205354, 0.2288873 , 0.77678375, 0.59478359, 0.13755356,
#        0.85289978])
numpy.fft.irfft(numpy.fft.rfft(a))
# array([0.24111601, 0.90078174, 0.37803686, 0.86982605, 0.38581891,
#        0.29202917, 0.72002065, 0.59446031, 0.23485829, 0.55698438,
#        0.42253411, 0.26457788, 0.49961714, 1.06138356, 0.45849842,
#        0.22863701, 0.68431715, 0.73579194, 0.14511054, 0.82140976])

Документация для возвращаемых значений numpy.fft.rfft и numpy.fft.irfft объясняет, почему это происходит, хотя ссылка на раздел «Примечания» для numpy.fft.irfft по-прежнему вводит в заблуждение:

numpy.fft.rfft (a, n = Нет, ось = -1, норма = Нет)

Возвращает:

out: сложный ndarray
Усеченный или дополненный нулями вход, преобразованный вдоль оси, обозначенной axis , или последний, если axis не указан.Если n является четным, длина преобразованной оси равна (n/2)+1.Если n нечетно, длина равна (n+1)/2.


numpy.fft.irfft (a, n = Нет, ось = -1, норма = нет)

Возвращает:

out: ndarray
Усеченный или дополненный нулями вход,трансформируется вдоль оси, обозначенной axis , или последней, если axis не указано.Длина преобразованной оси равна n , или, если n не задано, 2*(m-1), где m - длина преобразованной оси входа.Чтобы получить нечетное количество выходных точек, необходимо указать n .

...