标签: idl-programming-language

IDL和Python之间的FFT差异

我将一些简单的IDL代码传递给Python.但是,从SciPy/NumPy包中返回的FFT值与IDL包不同,我无法找到原因.

这一切减少到8种元素的一个简单的例子,我发现,SciPy的/ NumPy的例程返回比IDL那些(归一化的问题,我想)更大8(2 ^ 3)倍的值.

以下是两种语言的示例代码(从此处复制):

IDL

signal = ([-2., 8., -6., 4., 1., 0., 3., 5.])
fourier = fft(signal)
print, fourier
Run Code Online (Sandbox Code Playgroud)

回报

(1.62500,0.00000)(0.420495,0.506282)(0.250000,0.125000)(-1.17050,-1.74372)(-2.62500,-0.00000)(-1.17050,1.74372)(0.250000,-0.125000)(0.420495,-0.506282)

蟒蛇

from scipy.fftpack import fft
import numpy as N
…
signal = N.array([-2., 8., -6., 4., 1., 0., 3., 5.])
fourier = fft(signal)
print fourier
Run Code Online (Sandbox Code Playgroud)

回报

[13. + 0.j,3.36396103 + 4.05025253j,2.+ 1.j,-9.36396103-13.94974747j,-21.+ 0.j,-9.36396103 + 13.94974747j,2.-1.j,3.36396103 -4.05025253j]

我用NumPy包做到了,得到了相同的结果.我也试过print fft(signal, 8 )以防万一,但它返回了同样的,如预期的那样.

然而,并非所有,回到我真正的256个元素阵列,我发现差异不再是8或256,而是256*8!这只是疯了.

虽然我解决了这个问题,但我需要知道为什么会有这种差异.

解决了:这只是规范化,在某些时候我将IDL 256阵列分成8倍,我忘了删除.在Dougal的回答中,有我错过的文档.

python idl fft scipy idl-programming-language

4
推荐指数
1
解决办法
1367
查看次数

python scipy.stats.powerlaw否定指数

我想为scipy.stats.powerlaw例程提供负指数,例如a = -1.5,以便绘制随机样本:

"""
powerlaw.pdf(x, a) = a * x**(a-1)
"""

from scipy.stats import powerlaw
R = powerlaw.rvs(a, size=100)
Run Code Online (Sandbox Code Playgroud)

为什么需要> 0,如何提供负a以生成随机样本,以及如何提供归一化系数/变换,即

PDF(x,C,a) = C * x**a
Run Code Online (Sandbox Code Playgroud)

文档在这里

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.powerlaw.html

谢谢!

编辑:我应该补充一点,我正在尝试复制IDL的RANDOMP函数:

http://idlastro.gsfc.nasa.gov/ftp/pro/math/randomp.pro

python statistics scipy idl-programming-language

4
推荐指数
2
解决办法
4022
查看次数

如何在c ++中使用bitshift整数值

我知道这是一个常见的问题,我无法弄清楚为什么我会遇到这么多麻烦.我试图将IDL代码中的一行转换为c ++

IDL:

for i = 0,7 do begin

    b = ishfy(b,1)
    print,b

endfor
Run Code Online (Sandbox Code Playgroud)

我的C++代码:

    for(int i = 0; i < 7; i++)
    {
        b = b << 1;
        cout << b;
    }
Run Code Online (Sandbox Code Playgroud)

我的初始b是255,我希望收到254,252等.相反,我的第一位移位返回510.我认为我的问题是在移位之前没有将b转换为二进制形式.它是否正确?如果是这样,我该如何解决?

提前致谢!

c++ idl-programming-language

4
推荐指数
1
解决办法
689
查看次数

IDL 的 INT_TABULATE - SciPy 等价物?

我正在将一些代码从 IDL 移到 python 中。一个 IDL 调用是 INT_TABULATE,它在固定范围内执行积分。

INT_TABULATED 函数使用五点 Newton-Cotes 积分公式对闭区间 [MIN(x) , MAX(x)] 上的一组表格数据 { xi , fi } 进行积分。

Result = INT_TABULATED( X, F [, /DOUBLE] [, /SORT] )

结果是曲线下的面积。

IDL 文档

我的问题是,Numpy/SciPy 是否提供了类似的集成形式?我看到它[scipy.integrate.newton_cotes]存在,但它似乎返回“牛顿-科特斯积分而不是面积的权重和误差系数”。

python idl numpy scipy idl-programming-language

3
推荐指数
1
解决办法
1593
查看次数

如何在for循环中声明变量?(IDL)

例如,

我的文件在00.dat,01.dat,02.dat ... 之后命名,每个文件包含多个列,我用READCOL它们将它们读入变量.

for i = 0, n-1 do begin
    readcol, string(i, F='(I02)')+'.dat', F='D,D', a0, b0
    readcol, string(i, F='(I02)')+'.dat', F='D,D', a1, b1
    .
    .
    c1 = a1 / a0
    c2 = a2 / a0
    .
    .
    d1 = b1 / b0
    d2 = b2 / b0
    .
    .
endfor
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但如果有一百个变量,我不能逐个输入所有变量.

因此,我想使用for循环来生成:a(i),b(i),c(i),d(i).从这个意义上说,代码看起来像:

for i = 0, n-1 do begin
    readcol, string(i, F='(I02)')+'.dat',F='D,D', a(i), b(i)
endfor

for i = 0, n-1 do begin
    c(i) = a(i) …
Run Code Online (Sandbox Code Playgroud)

idl-programming-language

2
推荐指数
1
解决办法
4340
查看次数

IDL与Python Float

我一直在将IDL代码翻译成Python,并注意到最终产品的差异.这些差异也不容忽视(例如,通过IDL我获得19.03而Python获得19.16).我确认这两个脚本产生相同的值(它们通常在第四,第五或第六个十进制中不同),直到我开始执行多个数组操作.我怀疑精度可能是原因(Python和IDL数组都是type=FLOAT).我做了一个简单的实验,我也看到了很大的差异.

IDL

a = 0.01
b = 0.0

for r = 1,1000 do begin
   b += a
endfor
c = a * 1000

print,b
    >>> 10.0001
print,c
    >>> 10.0000
Run Code Online (Sandbox Code Playgroud)

蟒蛇

a = 0.01
b = 0.00

for r in range(1000):
    b += a
c = a * 1000

print(b)
    >>> 9.999999999999831
print(c)
    >>> 10.0
Run Code Online (Sandbox Code Playgroud)

当然,在这个例子中,差异仍然很小,但是Python显然比IDL更接近真相.我期望结果是相同的,因为两种语言都使用FLOAT精度.底线是错误以不同的方式在两种语言中传播,从而产生不同的结果.我的问题是:

  1. 两种语言之间的精确度是否存在差异(即,在IDL中FLOAT与在Python中的意义相同,我认为它确实如此)?

  2. 有没有办法调和精度差异?

  3. 我对IDL没有多少经验; 我错过了一些明显的东西吗

PS:

当我写这篇文章时突然出现.我看到与OP相同的问题(Python是正确的).

IDL

>>> 3015/0.0002529821940697729
>>> 11917835.
Run Code Online (Sandbox Code Playgroud)

蟒蛇

>>> 3015/0.0002529821940697729
>>> 11917834.814763514
Run Code Online (Sandbox Code Playgroud)

python precision idl-programming-language

0
推荐指数
1
解决办法
388
查看次数

使用Astropy在FITS表中挑选一行

我"只是"想要阅读(天文学)FITS表,并通过其名称选择一个对象的所有信息::

from astropy.io import fits
dr7q = fits.open('Shen_dr7_bh_May_2010.fits')
tbdata = dr7q[1].data
w = tbdata[tbdata['SDSS_NAME'] == 'J000006.53+003055.2']

print(tbdata[w])
Run Code Online (Sandbox Code Playgroud)

给出一个

IndexError: arrays used as indices must be of integer (or boolean) type
Run Code Online (Sandbox Code Playgroud)

试:

mask = (tbdata['SDSS_NAME'] == 'J000006.53+003055.2')
print(mask)
Run Code Online (Sandbox Code Playgroud)

然后给出一个数组原始FITS表文件的大小.这在IDL中是直截了当的.为什么这么难?!?!

python astronomy idl-programming-language fits astropy

-2
推荐指数
1
解决办法
107
查看次数