如何使用numpy loadtext加载多个列?

时间:2017-10-08 23:06:04

标签: python arrays numpy

我正在尝试将大约10列数据加载到numpy loadtxt中。我希望每列都是一个单独的numpy数组。我怎样才能做到这一点?实际上只导入了两列,我需要全部10.这里是我的代码:

import sys
import numpy as np 
import scipy.stats

data = np.loadtxt('AD_hw6.txt')

p = data[:,0] #pressure in hpa
z = data[:,1] #height in m
t = data[:,2] #tempertature in degrees celcius
dp = data[:,3] #dewpoint in degrees celcius
rh = data[:,4] #relative humidity (%)
mr = data[:,5] #mixing ratio in g/kg

这只是5,但我使用10。

3 个答案:

答案 0 :(得分:1)

使用WY链接中的copy-n-paste我使用

创建一个文件
-----------------------------------------------------------------------------
   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
    hPa     m      C      C      %    g/kg    deg   knot     K      K      K
-----------------------------------------------------------------------------
 1000.0    116
  971.0    357    8.0    6.0     87   6.07    200      5  283.5  300.6  284.6
  956.0    487    7.2    5.0     86   5.75    215     18  284.0  300.2  285.0
  942.1    610    8.0    5.5     84   6.06    230     30  286.0  303.2  287.1
  933.0    691    8.6    5.9     83   6.28    233     30  287.4  305.3  288.5
  925.0    763    8.0    4.9     81   5.90    235     30  287.5  304.4  288.5
  908.2    914    7.2    3.2     76   5.32    245     29  288.2  303.5  289.1
 ...

我可以将它作为2d数组加载:

In [1]: data = np.genfromtxt('stack46636938.txt',skip_header=5)
In [2]: data.shape
Out[2]: (35, 11)
In [3]: data[:3]
Out[3]: 
array([[ 971.  ,  357.  ,    8.  ,    6.  ,   87.  ,    6.07,  200.  ,
           5.  ,  283.5 ,  300.6 ,  284.6 ],
       [ 956.  ,  487.  ,    7.2 ,    5.  ,   86.  ,    5.75,  215.  ,
          18.  ,  284.  ,  300.2 ,  285.  ],
       [ 942.1 ,  610.  ,    8.  ,    5.5 ,   84.  ,    6.06,  230.  ,
          30.  ,  286.  ,  303.2 ,  287.1 ]])

请注意,我只使用两个值跳过该行。

现在我可以做到

p = data[:,0]

我也可以使用解包选项

In [7]: p,z,t = np.genfromtxt('stack46636938.txt',skip_header=5,unpack=True,usecols=range(3))

这相当于使用Python解包和2d数组的转置:

In [9]: p,z,t = data[:,:3].T

我还可以将数据作为结构化数组加载:

In [11]: names = '   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THT
    ...: A   THTE   THTV'.split()
In [12]: names
Out[12]: 
['PRES',
 'HGHT',
 'TEMP',
 'DWPT',
 ....
 'THTV']
In [13]: data = np.genfromtxt('stack46636938.txt', skip_header=5, dtype=None, names=names)
In [14]: data[:3]
Out[14]: 
array([( 971. , 357,  8. ,  6. , 87,  6.07, 200,  5,  283.5,  300.6,  284.6),
       ( 956. , 487,  7.2,  5. , 86,  5.75, 215, 18,  284. ,  300.2,  285. ),
       ( 942.1, 610,  8. ,  5.5, 84,  6.06, 230, 30,  286. ,  303.2,  287.1)],
      dtype=[('PRES', '<f8'), ('HGHT', '<i4'), ('TEMP', '<f8'), ('DWPT', '<f8'), ('RELH', '<i4'), ('MIXR', '<f8'), ('DRCT', '<i4'), ('SKNT', '<i4'), ('THTA', '<f8'), ('THTE', '<f8'), ('THTV', '<f8')])

并按名称访问字段

In [15]: data['PRES']
Out[15]: 
array([ 971. ,  956. ,  942.1,  933. ,  925. ,  908.2,  900. ,  875. ,
        850. ,  842.8,  827. ,  811.4,  792. ,  786. ,  781. ,  776. ,
        752.1,  736. ,  726. ,  724.1,  721. ,  714. ,  710. ,  706. ,
        703. ,  701. ,  700. ,  690. ,  671. ,  670.8,  669. ,  666. ,
        662. ,  645.4,  639. ])

loadtxt也适用于右行跳过并解压缩:

np.loadtxt('stack46636938.txt',skiprows=5,unpack=True)

如果包含短行,我会收到错误消息。它开始期待两列,然后在它得到11时的对象。

答案 1 :(得分:0)

我认为问题是第一列行只有2个值;我建议你为列中的空行填写零或NaN。

答案 2 :(得分:0)

我认为问题是第一列行只有2个值;我建议你为列中的空行填写零或NaN。