np.genfromtxt returns 列表,不是数组

np.genfromtxt returns a list, not an array

我正在使用 np.genfromtxt() 读取一系列逗号分隔的文本文件并加载到 NumPy 数组中进行下游处理(并最终写入 HDF5)。
当有 4(或更多)行(1 header、2+ 数据行、1 页脚)时,代码工作正常(returns 数组)。阅读 4 行后检查 array.shape 得到 (2, )。 (不读第一行和最后一行)

当我只有 3 行(1 header、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)
In [92]: dsp_dt = np.dtype ( [('H','S2'), ('YYMMDD',int),   
    ...:           ('NAME','S40'), ('COUNT',int)] )                                              
In [93]: txt="""H,YYMMDD,NAME,COUNT 
    ...: S,191001,NAME_1,13 
    ...: S,191001,Overall,13 
    ...: F,191001"""                                                                             
In [94]:                                                                                         
In [94]: dsp_recarr = np.genfromtxt(txt.splitlines(), delimiter=',', dtype=dsp_dt,  
    ...:                                skip_header=1, skip_footer=1, usecols=(1,2,3), 
    ...:                                names=None, encoding=None)                               
In [95]: dsp_recarr                                                                              
Out[95]: 
array([(191001, b'NAME_1', 13), (191001, b'Overall', 13)],
      dtype=[('YYMMDD', '<i8'), ('NAME', 'S40'), ('COUNT', '<i8')])
In [96]: _.shape                                                                                 
Out[96]: (2,)

只有一根数据线:

In [97]: dsp_recarr = np.genfromtxt(txt.splitlines(), delimiter=',', dtype=dsp_dt,  
    ...:                                skip_header=1, skip_footer=2, usecols=(1,2,3), 
    ...:                                names=None, encoding=None)                               
In [98]: dsp_recarr                                                                              
Out[98]: 
array((191001, b'NAME_1', 13),
      dtype=[('YYMMDD', '<i8'), ('NAME', 'S40'), ('COUNT', '<i8')])
In [99]: _.shape                                                                                 
Out[99]: ()
In [100]: print(dsp_recarr)                                                                      
(191001, b'NAME_1', 13)

loadtxt 有一个 ndim,我在 genfromtxt 中没有看到对应项。

整形后:

In [107]: dsp_recarr.reshape(1)                                                                  
Out[107]: 
array([(191001, b'NAME_1', 13)],
      dtype=[('YYMMDD', '<i8'), ('NAME', 'S40'), ('COUNT', '<i8')])
In [108]: print(dsp_recarr.reshape(1))                                                           
[(191001, b'NAME_1', 13)]