gpt4 book ai didi

python - 如何使用 genfromtxt() 从 NumPy 中的文本文件中读取不同长度的列?

转载 作者:太空狗 更新时间:2023-10-29 22:26:18 31 4
gpt4 key购买 nike

我有数百个这样的文本文件,每列由三个空格分隔。数据是一年的:12 个月,每个月 31 天。

下面,我只在下面展示与问题相关的内容:

001 DIST - ADILABAD ANDHRA 平均温度

 DATE  JAN    FEB    MAR . . . .  NOV    DEC  
01 21.5 24.3 27.1 25.8 22.4
02 21.4 24.2 27.1 25.8 22.4
. . . . . .
. . . . . .
. . . . . .
27 23.6 26.8 30.3 23.1 21.3
28 23.8 27.0 30.6 22.9 21.3
29 23.4 31.0 22.9 21.2
30 23.5 31.1 22.6 21.4
31 23.8 31.2 . . . . 21.6

我想将每一列读入一个数组,然后取平均。

为此,我使用 genfromtext() 函数,如下所示:

import numpy as np
JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC = np.genfromtxt("tempmean_andhra_adilabad.txt", skiprows=3,
unpack=True, invalid_raise=False,
usecols=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
autostrip=True)

如您所见,我跳过了前三行和第一列,并将每一列解压缩到一个数组中。如果没有 invalid_raise=False,我会收到以下错误:

Traceback (most recent call last):

File "pyshell#32", line 1, in 'module'
JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC = np.genfromtxt("temp mean_andhra_adilabad.txt",skiprows=3,unpack=True,usecols=(1,2,3,4,5,6,7,8,9,10,11,12),autostrip=True)
File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 1667, in genfromtxt
raise ValueError(errmsg)

ValueError: Some errors were detected !
Line #32 (got 12 columns instead of 12)
Line #33 (got 12 columns instead of 12)
Line #34 (got 8 columns instead of 12)

我认为这个问题是因为列的长度不同?还是别的什么原因?

我想查看输出,所以我使用了 invalid_raise=False。现在我的问题是,当我打印任何数组时,比如 JAN 我只得到 28 个元素。即每个数组只有 28 个元素。似乎每列仅读取 28 行,因为 FEB 列以 28 天结束。但是我需要每个月的数据,即 JAN 31 个元素 JUNE 等 30 个元素。

如何获取每个月的所有元素?

我认为这是一个非常基本的问题,但我是 Python 和 NumPy 的新手,两周前才开始学习。我在 StackOverflow 和 Google 上搜索了很多问题,了解了如何跳过行、列等。但我找不到与这个特定问题相关的任何答案。

请推荐一些模块、函数、代码等

提前致谢。

最佳答案

您的数据不是由文本“分隔”的。相反,它具有固定宽度的列。正如@EdChum 在他的回答中显示的那样,pandas 具有读取具有固定宽度列的数据的功能。您也可以使用 genfromtxt通过在 delimiter 参数中给出列宽。看起来字段宽度是 (4, 7, 7, 7, ...)。在下面的代码中,我将其写为 (4,) + (7,)*12:

In [27]: (4,) + (7,)*12
Out[27]: (4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7)

genfromtxt 使用的默认数据类型是 np.float64。如果一个字段不能转换为 float ,它将被替换为nan。所以少于 31 天的月末数据将为 nan

在下文中,我将您的文件重命名为“temp_mean.txt”。请注意,您的文件末尾有一个额外的空行,因此还使用了参数 skip_footer=1。如果您不使用此参数,您将在 data 中获得一行额外的 nan 值。

In [16]: data = genfromtxt("temp_mean.txt", skiprows=3, delimiter=(4,)+(7,)*12, usecols=range(1,13), skip_footer=1)

In [17]: data.shape
Out[17]: (31, 12)

In [18]: data[:,0] # JAN
Out[18]:
array([ 21.5, 21.4, 21.2, 21.2, 21.4, 21.7, 21.8, 22. , 22. ,
22.3, 22.3, 22.3, 22.5, 22.5, 22.5, 22.5, 22.5, 22.6,
22.8, 23.1, 23.1, 22.8, 22.9, 23.1, 23.4, 23.5, 23.6,
23.8, 23.4, 23.5, 23.8])

In [19]: data[:,1] # FEB
Out[19]:
array([ 24.3, 24.2, 24.3, 24.4, 24.6, 24.4, 24.1, 24.4, 24.5,
24.6, 24.9, 25. , 25.1, 25.6, 25.7, 25.7, 25.8, 26. ,
25.9, 25.9, 25.8, 25.8, 25.8, 26.2, 26.5, 26.7, 26.8,
27. , nan, nan, nan])

In [20]: data[-1,:] # Last row.
Out[20]:
array([ 23.8, nan, 31.2, nan, 34.7, nan, 27.4, 27. , nan,
25.7, nan, 21.6])

要获取月均值,可以使用np.nanmean:

In [21]: np.nanmean(data, axis=0)
Out[21]:
array([ 22.5483871 , 25.35714286, 29.22903226, 32.79333333,
34.65806452, 31.19666667, 27.89032258, 27.01612903,
27.66666667, 27.22580645, 24.34666667, 21.81290323])

关于python - 如何使用 genfromtxt() 从 NumPy 中的文本文件中读取不同长度的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24079745/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com