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