用numpy读取结构化列数据

时间:2014-10-13 22:22:25

标签: python numpy

所以我尝试使用以下内容用numpy读取以下文件:

import numpy as np

recordtype = np.dtype([('name', 'S24'),
                       ('ra', [(np.int32,np.int32,np.float32)]),
                       ('dec', [(np.int32,np.int32,np.float32)]),
                        ('z',np.float32), ('rmag',np.float32),('rmag_error',np.float32),
                        ('gmag',np.float32),('gmag_error',np.float32)])
qData = numpy.loadtxt("SDSS_quasar_cat5(1)", skiprows=6)

以下是数据文件的示例:

Results from heasarc_sdssquasar: Sloan Digital Sky Survey Quasar Catalog (10th Data Release: DR10Q)
Coordinate system:  Equatorial
|name                    |ra          |dec         |vi_redshift|rmag        |rmag_error  |gmag     |gmag_error  |
|SDSS J163313.26+352050.7|16 33 13.265|+35 20 50.77|     2.0000|2.480190e+01|3.865410e+00|2.511420e+01|9.026890e-01|
|SDSS J164135.36+372726.9|16 41 35.362|+37 27 26.96|     2.0000|2.279110e+01|1.722010e-01|2.203690e+01|7.126500e-02|
|SDSS J160420.86+275634.5|16 04 20.869|+27 56 34.52|     2.0010|2.008330e+01|2.592250e-02|2.048210e+01|2.699570e-02|
|SDSS J163948.06+331030.2|16 39 48.069|+33 10 30.27|     2.0010|1.945350e+01|1.478850e-02|1.971600e+01|1.617890e-02|
|SDSS J162006.83+395403.8|16 20 06.834|+39 54 03.83|     2.0020|1.937250e+01|2.033600e-02|1.942160e+01|2.408500e-02|

我似乎无法过去定义dtype。我是python的新手,并寻找示例,但我必须有一些错误。有什么建议?

THX!

1 个答案:

答案 0 :(得分:2)

以下是一个例子。

import numpy as np

recordtype = np.dtype([('name', 'S24'),
                       ('ra', np.float32),
                       ('dec', np.float32),
                       ('z',np.float32),
                       ('rmag',np.float32),
                       ('rmag_error',np.float32), 
                       ('gmag',np.float32),
                       ('gmag_error',np.float32)])

def ratodeg(string):
    hh, mm, ss = string.split()

    return (int(hh) * 15) + (int(mm) * 0.25) + (float(ss)  * 0.0042)

def dectodeg(string):
    return 

qData = np.loadtxt("sample",
                   skiprows=1,
                   dtype=recordtype,
                   delimiter = '|',
                   usecols = (1, 2, 3, 4, 5, 6, 7, 8),
                   converters = {1:str,
                                 2:ratodeg,
                                 3:dectodeg})

请注意loadtxt调用中的一些内容:

  1. 使用dtype指定正确的一个。否则NumPy会假设你想要一个浮点数数组
  2. 使用delimiter告诉loadtxt如何打破列
  3. usecolumns指定要使用的内容。列09是第一个|之前的空白在最后一个之后
  4. 使用converters。它为每个指定的列分配转换器函数。仅涉及第1-3列。默认转换器为float(...)
  5. 我将dectodeg留空了,因为我无法记住如何进行转化:P(我甚至不确定ratodeg是否正常。 。),所以现在dec每行nan