标签: astropy

如果某些数据点是NaN,如何拟合二维函数?

我正在尝试将2D表面适合数据。更具体地说,我想找到一个将像素坐标映射到波长坐标的函数,就像FITCOORDS在IRAF中一样。

举例来说,我想test在以下代码片段中找到适合数组的内容:

import numpy as np
from astropy.modeling.models import Chebyshev2D
from astropy.modeling.fitting import LevMarLSQFitter
#%%
test = np.array([[7473, 7040, 6613, 6183, 5753, 5321, 4888],
   [7474, 7042, 6616, 6186, np.nan, 5325, 4893],
   [7476, 7044, 6619, 6189, 5759, 5328, 4897],
   [7479, 7047, np.nan, 6192, 5762, 5331, 4900]])
grid_pix, grid_wave = np.mgrid[:4, :7]
fitter = LevMarLSQFitter()
c2_init = Chebyshev2D(x_degree=3, y_degree=3)
c2_fit = fitter(c2_init, grid_wave, grid_pix, test)
print(c2_fit)
Run Code Online (Sandbox Code Playgroud)

ResultI 在Python 3.6 上astropy 2.0.2numpy 1.13.3以下:

Model: Chebyshev2D …
Run Code Online (Sandbox Code Playgroud)

python numpy missing-data model-fitting astropy

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

宇宙学宇宙学问题,宇宙学.H(z)函数是无单位的

我正在尝试使用astropy.cosmology.正如文档所说,当我使用Hubble参数方法时,它应该给我一个单位的值 - astropy.cosmology documentation

但它给了我一个数字,可以在这里看到 -

ohm@ohm-ThinkCentre-M57:~/projects/mucalc$ python
Python 2.7.3 (default, Sep 26 2013, 20:08:41) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from astropy import cosmology
>>> cosmology.core.set_current(cosmology.Planck13)
>>> H0 = cosmology.H(10**6)
>>> print H0
647883886243.0
>>> H0.value
ERROR: AttributeError: 'numpy.float64' object has no attribute 'value' [unknown]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.float64' object has no attribute 'value'
>>> 
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

python astropy

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

astropy.io适合大表的有效元素访问

我试图使用Python和astropy.io从FITS文件中的二进制表中提取数据.该表包含一个包含超过200万个事件的事件数组.我想要做的是将某些事件的TIME值存储在一个数组中,这样我就可以对该数组进行分析.我遇到的问题是,虽然在fortran(使用FITSIO)中,相同的操作在速度慢得多的处理器上花费了几秒钟,但使用astropy.io的Python中完全相同的操作需要几分钟.我想知道瓶颈究竟在哪里,以及是否有更有效的方法来访问各个元素以确定是否将每个时间值存储在新数组中.这是我到目前为止的代码:

from astropy.io import fits

minenergy=0.3
maxenergy=0.4
xcen=20000
ycen=20000
radius=50

datafile=fits.open('datafile.fits')
events=datafile['EVENTS'].data


datafile.close()

times=[]

for i in range(len(events)):
    energy=events['PI'][i]
    if energy<maxenergy*1000:
        if energy>minenergy*1000:
            x=events['X'][i]
            y=events['Y'][i]
            radius2=(x-xcen)*(x-xcen)+(y-ycen)*(y-ycen)
            if radius2<=radius*radius:
                times.append(events['TIME'][i])

print times
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.我是其他语言的好程序员,但我之前不必担心Python的效率.我之所以选择在Python中这样做的原因是我在使用fortran和FITSIO以及PGPLOT,以及来自Numerical Recipes的一些例程,但我在这台机器上使用的新旧fortran编译器无法说服它产生正常工作程序(存在32-与64位等问题).Python似乎具有我需要的所有功能(FITS I/O,绘图等),但是如果需要永远访问列表中的各个元素,我将不得不寻找另一种解决方案.

非常感谢.

python arrays fits astropy

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

将包含在第一行中的标题的ascii文件读入pandas数据帧

我有一组庞大的目录,每列有不同的列和不同的标题名称,每个标题名称的描述在我的ascii文件的开头连续给出.阅读它们的最佳方法是什么pandas.DataFrame,它可以设置列的名称,而无需从头开始定义它.以下是我的目录示例:

#   1 MAG_AUTO            Kron-like elliptical aperture magnitude         [mag]
#   2 rh                  half light radius (analyse)                     [pixel]
#   3 MU_MAX              Peak surface brightness above background        [mag * arcsec**(-2)]
#   4 FWHM_IMAGE          FWHM assuming a gaussian core                   [pixel]
#   5 CLASS_STAR          S/G classifier output                          
18.7462 4.81509 20.1348 6.67273 0.0286538
18.2440 7.17988 20.6454 21.6235 0.0286293
18.3102 3.11273 19.0960 8.26081 0.0430532
21.1751 2.92533 21.9931 5.52080 0.0290418
19.3998 1.86182 19.3166 3.42346 0.986598
20.0801 3.52828 21.3484 6.76799 0.0303842
21.9427 2.08458 22.0577 5.59344 0.981466 …
Run Code Online (Sandbox Code Playgroud)

python numpy pandas astropy

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

使用相同的投影在图像上绘制线条

我想使用 .fits 文件(天文图像)绘制绘图,并且我遇到了两个我认为它们相关的问题:

使用天文学中的这个例子:

from matplotlib import pyplot as plt
from astropy.io import fits
from astropy.wcs import WCS
from astropy.utils.data import download_file

fits_file = 'http://data.astropy.org/tutorials/FITS-images/HorseHead.fits'
image_file = download_file(fits_file, cache=True)
hdu = fits.open(image_file)[0]
wcs = WCS(hdu.header)

fig = plt.figure()
fig.add_subplot(111, projection=wcs)
plt.imshow(hdu.data, origin='lower', cmap='cubehelix')
plt.xlabel('RA')
plt.ylabel('Dec')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我可以生成这个图像:

在此输入图像描述

现在我想使用与图像相同的坐标绘制一些点:

plt.scatter(85, -2, color='red')
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时:

在此输入图像描述

我正在绘制像素坐标。此外,图像不再与帧大小匹配(尽管坐标看起来不错)

关于如何处理这些问题有什么建议吗?

python image matplotlib astronomy astropy

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

如何为百万元素加速Python嵌套循环

我尝试将两个对象(一个数据集包含大约五百万个元素,另一个包含大约200万个元素)配对,满足某些条件,然后将两个对象的信息保存到文件中.许多变量不参与配对计算,但它们对我的后续分析很重要,因此我需要跟踪这些变量并保存它们.如果有办法对整个分析进行矢量化,那么速度会快得多.在下面我以随机数为例:

import numpy as np
from astropy import units as u
from astropy.coordinates import SkyCoord
from PyAstronomy import pyasl


RA1 = np.random.uniform(0,360,500000)
DEC1 = np.random.uniform(-90,90,500000)
d = np.random.uniform(55,2000,500000)
z = np.random.uniform(0.05,0.2,500000)
e = np.random.uniform(0.05,1.0,500000)
s = np.random.uniform(0.05,5.0,500000)
RA2 = np.random.uniform(0,360,2000000)
DEC2 = np.random.uniform(-90,90,2000000)
n = np.random.randint(10,10000,2000000)
m = np.random.randint(10,10000,2000000)

f = open('results.txt','a')
for i in range(len(RA1)):
    if i % 50000 == 0:
        print i
    ra1 = RA1[i]
    dec1 = DEC1[i]
    c1 = SkyCoord(ra=ra1*u.degree, dec=dec1*u.degree)
    for j in range(len(RA2)):
        ra2 = …
Run Code Online (Sandbox Code Playgroud)

python loops numpy vector astropy

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

astropy 适合多个标头

我正在尝试在 Python 中创建 FITS 文件,但在将标头和 PrimaryHDU 一起编译时似乎遇到问题。

我做了一个简单的例子,它会给出我收到的错误:

import numpy as np
from astropy.io import fits

a = np.ones([5,5])
hdu = fits.PrimaryHDU(a)
hdr = fits.Header()
hdr['NPIX1'] = 60
hdr['NPIX2'] = 60
hdr['CRPIX1'] = 0
hdr['CRPIX2'] = 0
primary_hdu = fits.PrimaryHDU(header=hdr)
hdul = fits.HDUList([primary_hdu, hdu])
hdul.writeto('table4.fits')
Run Code Online (Sandbox Code Playgroud)

运行此代码时,我收到以下错误:

verifyError:验证报告错误:HDUList 的元素 1 不是扩展 HDU。注意:astropy.io.fits 使用从零开始的索引。

我看过一些帖子,声称这可能与导出时 PrimaryHDU 需要成为 HDUList 中的第一个有关,但看看我的代码,我相信我已经这样做了。

任何帮助将不胜感激,谢谢。

python fits astropy

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

将 astropy 表转换为字典列表

我有一个 astropy.table.table 对象保存星星数据。每颗恒星一行,列包含恒星名称、最大星等数据。

我理解天文表的内部表示是每列的字典,行作为字典对象的切片即时返回。

我需要将 astropy 表转换为 dict 对象的 Python 列表,每个星一个 dict。本质上,这既是表格的转置,也是转换。

显然,我可以按行内的列迭代表,以构建字典并将它们添加到列表中,但我希望有一种更有效的方法?

python dictionary list astropy

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

如何使用真实坐标绘制 FITS 文件中的图像?

astropy文档有一个关于如何从 FITS 文件绘制图像的示例。结果图上的轴对应于像素或数据点的数量。我希望轴指示银河坐标。

请注意,我的 FITS 文件的标头指示了有关图像在天空上的位置的所有信息。如何让绘图显示真实坐标而不是像素数?

python-3.x fits astropy

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

将赤道坐标转换为 alt-az 坐标非常慢

我正在尝试将对象的赤道坐标转换为给定时间和位置的 alt-az 坐标(希望)<5 秒运行时,或更理想的是 <1 秒运行时。

按照坐标变换astropy 教程,我设置了以下代码:

from astropy import units as u
from astropy.coordinates import SkyCoord,EarthLocation, AltAz
from astropy.time import Time

target = SkyCoord(9.81625*u.deg, 0.88806*u.deg, frame='icrs')

location = EarthLocation(lat='31d57.5m', lon='-111d35.8m', height=0*u.m)
obs_time = Time('2010-12-21 1:00')

alt_az_frame = AltAz(location=location, obstime=obs_time)
target_alt_az = target.transform_to(alt_az_frame)

print(target_alt_az.alt, target_alt_az.az)
Run Code Online (Sandbox Code Playgroud)

这段代码运行需要 20 秒,几乎所有这些都来自该target.transform_to(alt_az_frame)行。

有没有更合适的方法来使用transform_to函数来加速代码,或者我应该完全放弃使用 astropy 并从头开始编写代码?我知道SkyCoord对象中内置了很多额外的功能,其中大部分我可能不需要——使用预先构建的标准化代码很方便。

python astropy

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