“Astropy”的版本间差异

来自Shiyin's note
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
 
(未显示同一用户的5个中间版本)
第1行: 第1行:
*很好的教程网站 [https://learn.astropy.org/]
*很好的教程网站 [https://learn.astropy.org/]
:比如星际红化的 [https://learn.astropy.org/tutorials/color-excess.html]
:比如星际红化的 [https://learn.astropy.org/tutorials/color-excess.html]
== astropy.io.fits ==
[http://docs.astropy.org/en/stable/io/fits/]


==io==
>>> hdulist = fits.open('input.fits')
* [[astropy.io.fits]]
>>> hdulist.info()
* ascii文件:Table格式,支持ecsv文件直接读入table

===header===
*each element of an HDUList is an HDU object with .header and .data attributes, which can be used to access the header and data portions of the HDU.
>>> hdulist[0].header['targname']

*To see the entire header as it appears in the FITS file (with the END card and padding stripped), simply enter the header object by itself, or print(repr(header)):
*It’s also possible to view a slice of the header:
>>> header[:2]
*Another way to either update an existing card or append a new one is to use the Header.set() method:
>>> prihdr.set('observer', 'Edwin Hubble')

===fits table 的读与写===
*写
from astropy.table import Table
t=Table([Bage,fzbin,Age_weight2],names=('Age','z','weights'))
t.write('SFH_LMC3_out.fits',format='fits')
*读
hdu = fits.open('SFH_LMC3_out.fits')
hdu.info() #看看哪些hdu
data=hdu[1].data
data.columns #看看有那些列
Bage=data.field('Age')

===fits文件打开过多错误===
* [https://docs.astropy.org/en/stable/io/fits/appendix/faq.html#i-am-opening-many-fits-files-in-a-loop-and-getting-oserror-too-many-open-files]
* fits.close()
* 可能还根系统设置有关
ulimit -a
ulimit -n 100000
vim /etc/security/limits.conf
* 把python的软限制编程硬限制,参见 [https://bbs.huaweicloud.com/blogs/108323],下面方法貌似也不管用
import resource
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
resource.setrlimit(resource.RLIMIT_NOFILE, (hard, hard))
*lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析
* 实测这两个效果不好(python 3.8)
:*del hdu.data
:*hdu = fits.open(fits_name,memmap=False) #打开fits文件数目比较多的情况下

==fits image读写==
n = np.arange(100.0)
hdu = fits.PrimaryHDU(n)
hdu.writeto('new2.fits')
hdu.writeto('new2.fits')
*如果超过一个hdu
>>> hdul = fits.HDUList([hdu])
>>> hdul.writeto('new1.fits')


==astrometry==
==astrometry==
第60行: 第12行:
>>> c = SkyCoord(ra=ra1*u.degree, dec=dec1*u.degree)
>>> c = SkyCoord(ra=ra1*u.degree, dec=dec1*u.degree)
>>> catalog = SkyCoord(ra=ra2*u.degree, dec=dec2*u.degree)
>>> catalog = SkyCoord(ra=ra2*u.degree, dec=dec2*u.degree)
>>> idx, d2d, d3d = c.match_to_catalog_sky(catalog)
>>> idx, d2d, d3d = c.match_to_catalog_sky(catalog) #d3d是假设距离为1的地方的3维距离,因此是以弧度为单位
>>> sel=np.where(d2d.degree < 0.00002)
>>> sel=np.where(d2d.degree < 0.00002)
>>> Nsel=len(sel[0])
>>> print(ra1[sel][0],ra2[idx[sel][0])
*算出任意两点之间距离向量的PA角,还有中点坐标[https://docs.astropy.org/en/stable/coordinates/matchsep.html]


==宇宙学==
==宇宙学==

2024年7月12日 (五) 14:24的最新版本

  • 很好的教程网站 [1]
比如星际红化的 [2]

io

  • astropy.io.fits
  • ascii文件:Table格式,支持ecsv文件直接读入table

astrometry

  • match 两个星表
>>> from astropy.coordinates import SkyCoord
>>> from astropy import units as u
>>> c = SkyCoord(ra=ra1*u.degree, dec=dec1*u.degree)  
>>> catalog = SkyCoord(ra=ra2*u.degree, dec=dec2*u.degree)  
>>> idx, d2d, d3d = c.match_to_catalog_sky(catalog) #d3d是假设距离为1的地方的3维距离,因此是以弧度为单位
>>> sel=np.where(d2d.degree < 0.00002)
>>> Nsel=len(sel[0])
>>> print(ra1[sel][0],ra2[idx[sel][0])
  • 算出任意两点之间距离向量的PA角,还有中点坐标[3]

宇宙学

http://docs.astropy.org/en/stable/cosmology/

  • 从红移到年龄
>>>from astropy.cosmology import FlatLambdaCDM 
>>>cosmo = FlatLambdaCDM(H0=70, Om0=0.3)

>>> lum_dis=cosmo.luminosity_distance(redshift) #计算光度距离

  • 从年龄到红移
>>> import astropy.units as u
>>> from astropy.cosmology import  z_at_value
>>> z_at_value(cosmos.age, 2 * u.Gyr)

单位转换

dL=lum_dis.to(u.cm)

bug

  • 在anaconda3.8.3升级 astropy 和liberfc之后,astropy.fits出错,解决方法是降级
  • 安装pytorch之后,自动降级到4.3,但是还是又小问题
  • 进一步conda指定降级到4.2才行
  • 可以看出conda的版本管理并不好,