我将一些简单的IDL代码传递给Python.但是,从SciPy/NumPy包中返回的FFT值与IDL包不同,我无法找到原因.
这一切减少到8种元素的一个简单的例子,我发现,SciPy的/ NumPy的例程返回比IDL那些(归一化的问题,我想)更大8(2 ^ 3)倍的值.
以下是两种语言的示例代码(从此处复制):
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的回答中,有我错过的文档.
我想为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函数:
我知道这是一个常见的问题,我无法弄清楚为什么我会遇到这么多麻烦.我试图将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转换为二进制形式.它是否正确?如果是这样,我该如何解决?
提前致谢!
我正在将一些代码从 IDL 移到 python 中。一个 IDL 调用是 INT_TABULATE,它在固定范围内执行积分。
INT_TABULATED 函数使用五点 Newton-Cotes 积分公式对闭区间 [MIN(x) , MAX(x)] 上的一组表格数据 { xi , fi } 进行积分。
Result = INT_TABULATED( X, F [, /DOUBLE] [, /SORT] )
结果是曲线下的面积。
我的问题是,Numpy/SciPy 是否提供了类似的集成形式?我看到它[scipy.integrate.newton_cotes]存在,但它似乎返回“牛顿-科特斯积分而不是面积的权重和误差系数”。
例如,
我的文件在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代码翻译成Python,并注意到最终产品的差异.这些差异也不容忽视(例如,通过IDL我获得19.03而Python获得19.16).我确认这两个脚本产生相同的值(它们通常在第四,第五或第六个十进制中不同),直到我开始执行多个数组操作.我怀疑精度可能是原因(Python和IDL数组都是type=FLOAT).我做了一个简单的实验,我也看到了很大的差异.
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精度.底线是错误以不同的方式在两种语言中传播,从而产生不同的结果.我的问题是:
两种语言之间的精确度是否存在差异(即,在IDL中FLOAT与在Python中的意义相同,我认为它确实如此)?
有没有办法调和精度差异?
我对IDL没有多少经验; 我错过了一些明显的东西吗
当我写这篇文章时突然出现.我看到与OP相同的问题(Python是正确的).
>>> 3015/0.0002529821940697729
>>> 11917835.
Run Code Online (Sandbox Code Playgroud)
>>> 3015/0.0002529821940697729
>>> 11917834.814763514
Run Code Online (Sandbox Code Playgroud) 我"只是"想要阅读(天文学)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中是直截了当的.为什么这么难?!?!