- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有数百个这样的文本文件,每列由三个空格分隔。数据是一年的: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/
我有一个简单的 pyparsing 构造,用于提取日志消息的部分内容。看起来像这样 log_line = 时间戳 + task_info + Suppress(LineEnd()) 此结构可以很好地解
我想定义一个函数 scaryDict(),它接受一个参数(textfile)并返回 textfile 中的单词按字母顺序排列,基本上生成字典但不打印任何一个或两个字母的单词。 这是我目前所拥有的……不
我正在尝试弄清楚如何包含对外部数据文件(文本形式)的引用,我希望通过 Web Start (JNLP) 与我的应用程序一起分发该文件。筛选 JNLP 结构的文档,我发现您可以包含对 JAR、nativ
我尝试将 Java 程序从 Eclipse 导出到 .jar 文件,但遇到了问题。它运行良好,但由于某种原因它没有找到它应该从中获取数据的文本文件。如果有人能帮忙解决这个问题,我将非常感激。 最佳答案
在过去的 20 个小时里,我试图解决以下问题,所以在开始考虑跳出窗外之前我想,我最好在这里寻求帮助: I have a text file with following content: ID 1 T
今天我试图删除一个简单文本文件中的重复行,例如: input (list.txt): hello hello try output (list.txt): try 我尝试使用 Notepad++ 删除
我将一个文本文件添加到我的项目中,如下路径所示: Myproject/WebPages/stopwords.txt 图片: http://s7.postimg.org/w65vc3lx7/Untitl
所以我在我的程序上工作,现在我无法找到解决方案。我需要在 fext 文件中替换更多的符号,目前程序只将“TIT”替换为代码“*245$a”,如果我想用同样的方式替换其他字母,程序不会改变。有人知道如何
这是一个非常简单的问题,但无论我看哪里,我都会得到不同的答案(这是因为它在 c++0x 中已经改变还是将要改变?): 在 C++ 中,我如何从一个文本文件中读取两个数字并将它们输出到另一个文本文件中?
我有一个 C++ 项目应该添加 到每一行的开头和到每一行的末尾。这适用于普通英文文本,但我有一个中文文本文件,我想这样做,但它不起作用。我通常使用 .txt 文件,但为此我必须使用 .rtf 来保存中
所以我的驱动看起来像这样: #include "problem2.h" #include "problem1.h" #include "problem3.h" #include #include
我有一个包含字符串标识符的 ascii 数字文本文件(>50k 行),可以将其视为数据 vector 的集合。根据用户输入,应用程序在运行时只需要这些数据 vector 之一。 据我所知,我有 3 个
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Any decent text diff/merge engine for .NET ? 我有两个文本文件,
我正在尝试将对话选择器中的唤醒时间和 sleep 时间记录到这样的文本文件中,但是对方法 commitToFile2 的调用不会 append 文本文件“savedData.txt”。 我知道这段代码
我开发了一个 android webview 并尝试在单击 webview 中的链接时下载生成的数据:文本文件。 webView.setDownloadListener(new Downloa
我在一个文本文件中有 250 张图像/天 4000*3000 像素。 file '/home/user/camdata/nonseqdata.jpg' file '/home/user/camdata
我曾多次尝试将此配置文件转换为多维数组,这意味着我必须读取 config.txt 文件,然后必须将其转换为多维数组。我需要帮助或一些建议。 配置文件: id=www session.timeout=1
我正在尝试使用 sublime text 3 打开文件,我想用光标在具体行号处打开它。 我一直在查subl --help但我找不到混凝土线的选择。因此我只是使用:subl filename 有没有办法
我想在我的应用程序中快速显示一个大文本文件的内容,而不是将整个文件加载到内存中。 其他人是怎么做的? Total Commander是一个很棒的工具,它有一个很棒的内部查看器可以做到这一点。无论文件有
我是一名优秀的程序员,十分优秀!