我正在尝试在Python中找到Hankel变换的任何现有实现(实际上我更多的是两个2d径向对称函数的对称傅立叶变换,但它可以很容易地简化为hankel变换)。
我知道hankel
python模块,但它需要lambda函数进行输入,而我只有1d数组。
有什么想法吗?
答案 0 :(得分:2)
我是hankel的作者。虽然我不建议在这种情况下使用我的代码(因为正如你所提到的,它需要一个可调用的输入函数,其目的是准确计算积分,而不是做DHT),我会说它是可能。
您需要做的就是插入输入1D数组。如何做到这一点取决于你,但通常类似以下内容的工作非常好:
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)
执行此操作的一个主要问题是选择参数N
和h
,以便对k
中kvec
的所有值进行近似转换。如果kvec
跨越宽动态范围,则hankel
效率非常低,因为它在变换中为每个N
使用相同的基础数组(长度为k
),这意味着最困难的k
设置了性能级别。
再说一遍,简而言之我不会推荐hankel
,但如果你找不到任何其他东西,它仍然可以使用; - )
答案 1 :(得分:2)
我的一个朋友正在寻找使用Python进行汉克尔转换的方法,并在确定没有可用的方法后(部分是基于对这个问题的答案),与我分享了我的知识。
此程序包按照原始问题的要求(如果过了几年!)执行准离散汉克尔变换,但希望此答案能将找到该问题的未来用户(如我的朋友)引导到正确的位置。 / p>
答案 2 :(得分:1)
如果您通过转化部分阅读了Hankel的文档,您会看到要执行您调用hankel.transform(function, array, ret_err=bool)
的转换,因此您只需要无论你需要什么形式的转型。我相信在Hankel Transformation的维基百科条目中有一个转换函数列表。