2017-04-06 117 views
0

我试图找到任何现有的Hankel变换在Python中的实现(实际上,我更多地进入两个2d径向对称函数的对称傅里叶变换,但它可以轻松地简化为hankel变换)。Python:用于1d阵列的快速汉克尔变换

我知道关于hankel python模块,但它需要lambda函数输入,而我只有1d数组。

有什么想法?

+1

的GNU科学图书馆(GSL)包括用于计算离散[功能Hankel转换](https://www.gnu.org/software/gsl/manual/html_node/Discrete-Hankel-Transforms.html#Discrete-Hankel-Transforms)。 [PyGSL](http://pygsl.sourceforge.net/)提供了一个GSL的Python包装器。自从我尝试安装它以来已经有一段时间了,所以我不知道这将是多么具有挑战性。 –

回答

1

我是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) 

本大题有这样做是在选择参数Nh使得变换以及近似的所有值kkvec。如果kvec跨越很宽的动态范围,那么hankel效率非常低,因为它在变换中为每个k使用相同的基础阵列(长度为N),这意味着最困难的k会设置性能级别。

如此反复,总之我不会推荐hankel,但如果你不能找到任何东西,它仍然会工作;-)

1

如果你读了Hankel文档通过变换节中的所有方式,你会看到执行调用hankel.transform(function, array, ret_err=bool)改造,所以你只需要为你需要转换的任何形式的功能。我相信在维基百科条目Hankel Transformation中有一个转换函数列表。

+0

我应该更清楚地说明:我已经阅读过文档,并且要求__callable__函数在'hankel.transform'中输入,但我有1d-array而不是 –

+0

你是说你的函数表示为1d阵列。我的印象是你需要''hankel.tranform'方法的可调用和数组。 – Grr

+0

我需要的是'hankel.transform(array,array,ret_err)' –