Skip to main content
 首页 » 编程设计

python之如何使用 numpy loadtxt 加载多列

2025年01月19日13zhenyulu

我正在尝试将大约 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 个。

请您参考如下方法:

通过 WY 链接中的复制粘贴,我创建了一个文件

----------------------------------------------------------------------------- 
   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 
 ... 

我可以将它加载为二维数组:

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 解包和二维数组的转置:

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 时反对。