【发布时间】:2020-01-28 20:32:01
【问题描述】:
我正在使用np.genfromtxt() 读取一系列以逗号分隔的文本文件并加载到 NumPy 数组中以进行下游处理(并最终写入 HDF5)。
当有 4 行(或更多)行(1 个标题、2 个以上数据行、1 个页脚)时,代码可以正常工作(返回一个数组)。读取 4 行后对 array.shape 的检查给出(2, )。 (第一行和最后一行不读)
当我只有 3 行(1 个页眉、1 个数据行、1 个页脚)时,我不明白返回了什么。对array.shape 的检查给出(),当我打印数组时,没有括号[]。我认为这是一个清单。当np.genfromtxt() 只找到一行数据时,我需要做什么才能获取数组?
我创建了一个示例来模拟 2 个简单文件的行为。 (数据和输出遵循源代码)。
注意:字段名称和数据类型用np.dtype.定义,我用skip_header=1, skip_footer=1跳过第一行和最后一行,usecols=()只读取一些列。
import numpy as np
import glob
dsp_dt = np.dtype ( [('H','S2'), ('YYMMDD',int),
('NAME','S40'), ('COUNT',int)] )
for dsp_name in glob.glob('data_2019-10-*.txt'):
print(dsp_name)
dsp_recarr = np.genfromtxt(dsp_name, delimiter=',', dtype=dsp_dt,
skip_header=1, skip_footer=1, usecols=(1,2,3),
names=None, encoding=None)
print(dsp_recarr.dtype)
print(dsp_recarr.shape)
print(dsp_recarr)
文件:data_2019-10-01.txt
H,YYMMDD,NAME,COUNT
S,191001,NAME_1,13
S,191001,Overall,13
F,191001
文件:data_2019-10-02.txt
H,YYMMDD,NAME,COUNT
D,191002,NODATA,0
F,191002
输出:
data_2019-10-01.txt
[('YYMMDD', '<i4'), ('NAME', 'S40'), ('COUNT', '<i4')]
(2,)
[(191001, b'NAME_1', 13) (191001, b'Overall', 13)]
data_2019-10-02.txt
[('YYMMDD', '<i4'), ('NAME', 'S40'), ('COUNT', '<i4')]
()
(191002, b'NODATA', 0)
【问题讨论】:
-
在 4 行示例中,您将获得 元组 的列表。在三行示例中,只有一个元组要返回,因此不需要将其放入列表中
-
使用像
dsp_dt这样的复合dtype,你会得到一个structured array,1d 但有几个fields。使用 1 行,它可以为您提供一个具有 1 个元素(相同字段)的 0d 数组。print(repr(dsp_recarr))可以更全面地显示数组。 -
@hpaulj,谢谢。这也是我的理解。 Numpy 文档说 genfromtxt 返回一个 ndarray。我的打印声明可能会混淆这个问题。在控制台窗口中输入
dsp_recarr,按预期输出array((191002, b'NODATA', 0), dtype=[...])。 -
loadtxt有一个ndim我认为可以返回一个 (1,) 形状数组。我没有看到genfromtxt的等价物。
标签: python numpy genfromtxt