【问题标题】:np.genfromtxt returns a list, not an arraynp.genfromtxt 返回一个列表,而不是一个数组
【发布时间】: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


【解决方案1】:
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)]

【讨论】:

  • .reshape(1) 看起来很有希望。我可以检查len(dsp_recarr.shape),如果它是 ==0,则重新整形。或者可能重写代码以使用loadtxt 来免费获得ndim。这么多的健美操要读 1 场。哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2016-05-03
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多