Python:一维数组的快速汉克尔变换

Ant*_*nov 1 python numpy fft transform

我正在尝试在 Python 中找到 Hankel 变换的任何现有实现(实际上我更喜欢两个 2d 径向对称函数的对称傅立叶变换,但它可以很容易地简化为 hankel 变换)。

我确实了解hankelpython 模块,但它需要 lambda 函数进行输入,而我只有一维数组。

有什么想法吗?

Ste*_*ray 6

我是hankel的作者。虽然我不建议在这种情况下使用我的代码(因为正如您所提到的,它需要一个可调用的输入函数,其目的是准确计算积分,而不是执行 DHT),但我会说这可能的。

您需要做的就是对输入的一维数组进行插值。如何做到这一点取决于您,但通常类似以下内容的方法效果很好:

from scipy.interpolate import InterpolatedUnivariateSpline as Spline
import numpy as np

x, y = # Import/create data vectors

# Do this if y is both negative and positive
fnc = Spline(x,y, k=1) #I usually choose k=1 in case anything gets extrapolated.

# Otherwise do this
spl = Spline(np.log(x), np.log(y), k=1)
fnc = lambda x : np.exp(spl(np.log(x)))

# Continue as normal with hankel.transform(fnc, kvec)
Run Code Online (Sandbox Code Playgroud)

这样做的一个大问题是选择参数Nh并且对于kin 的所有值都可以很好地近似变换kvec。如果kvec跨越很宽的动态范围,则hankel效率非常低,因为它在转换中N为每个数组使用相同的底层数组(长度为)k,这意味着最困难的k设置性能级别。

再说一次,简而言之,我不推荐hankel,但如果您找不到其他任何东西,它仍然可以工作;-)


EdR*_*EdR 5

我的一个朋友正在寻找 Python 中的 Hankel 变换,在确定没有任何可用的东西后(部分是基于这个问题的答案)找到我分享我的。

我现在已经整理、记录并发布了PyHank代码(文档)。

这个包按照原始问题的要求执行准离散汉克尔变换(如果晚了几年!),但希望这个答案能够将找到这个问题的未来用户(比如我的朋友)引导到正确的地方。