np.genfromtxt возвращает список, а не массив - PullRequest
0 голосов
/ 28 января 2020

Я использую np.genfromtxt() для чтения серии текстовых файлов с разделителями-запятыми и загрузки в NumPy массивы для последующей обработки (и в конечном итоге записи в HDF5).
Код работает нормально (возвращает массив), когда Есть 4 (или более) строки (1 заголовок, 2+ строки данных, 1 нижний колонтитул). Проверка array.shape после чтения 4 строк дает (2, ). (первая и последняя строки не читаются)

Я не понимаю, что возвращается, когда у меня есть только 3 строки (1 заголовок, 1 строка данных, 1 нижний колонтитул). Проверка array.shape дает (), и когда я печатаю массив, скобки не отображаются []. Я думаю, что это список. Что мне нужно сделать, чтобы получить массив, когда np.genfromtxt() находит только одну строку данных?

Я создал пример для mimi c поведения с двумя простыми файлами. (Данные и вывод следуют за исходным кодом). Примечания: Имена полей и тип данных определяются с помощью 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)

1 Ответ

1 голос
/ 28 января 2020
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)]
...