Добавление параметра names в numpy genfromtxt, заставляющий читать пустые строки для данных - PullRequest
0 голосов
/ 19 июня 2019

Я могу нормально прочитать файл данных, но как только я пытаюсь добавить параметр имени, либо указав имена самостоятельно, либо читая из первой строки, я получаю пустые строки

data_no_headers = genfromtxt('SimpleDataWithHeaders.csv',delimiter=',',dtype='str',autostrip=True)
print(data_no_headers)
data_with_headers = genfromtxt('SimpleDataWithHeaders.csv',delimiter=',',dtype='str',autostrip=True,names=True)
print(data_with_headers)
data_with_headers = genfromtxt('SimpleDataWithHeaders.csv',delimiter=',',skip_header=1,dtype='str',autostrip=True,names="A,B")
print(data_with_headers)
mycols = ['a','b']
data_with_headers = genfromtxt('SimpleDataWithHeaders.csv',delimiter=',',skip_header=1,dtype='str',autostrip=True,names=mycols)
print(data_with_headers)

Если я выполню этот код, я получу следующий вывод (я сделал очень простой CSV-файл с тремя строками и строкой заголовка, чтобы проиллюстрировать проблему), вы можете увидеть вывод, который я получаю с каждой из команд выше. Вы можете видеть, что он работает нормально, пока я не добавлю параметр names

[['CODE' 'AIRPORT']
['HOU' 'Houston']
['ABQ' 'Alberquerque']
['BWI' 'Baltimore']]

[('', '') ('', '') ('', '')]

[('', '') ('', '') ('', '')]

[('', '') ('', '') ('', '')]

1 Ответ

0 голосов
/ 20 июня 2019

Имитируемый файл:

In [243]: txt = """CODE, AIRPORT 
     ...: HOU, Houston 
     ...: ABQ, Alberquerque 
     ...: BWI, Baltimore"""                                                               

для чтения без использования заголовков:

In [244]: data = np.genfromtxt(txt.splitlines(), delimiter=',', dtype=str, skip_header=1, 
     ...: encoding=True)                                                                  
In [245]: data                                                                            
Out[245]: 
array([['HOU', ' Houston'],
       ['ABQ', ' Alberquerque'],
       ['BWI', ' Baltimore']], dtype='<U13')

В результате получается 2d-массив со строкой dtype.

Использованиеheader и dtype = None:

In [246]: data = np.genfromtxt(txt.splitlines(), delimiter=',', dtype=None, names=True, en
     ...: coding=True)                                                                    
In [247]: data                                                                            
Out[247]: 
array([('HOU', ' Houston'), ('ABQ', ' Alberquerque'),
       ('BWI', ' Baltimore')],
      dtype=[('CODE', '<U3'), ('AIRPORT', '<U13')])
In [248]: data.shape                                                                      
Out[248]: (3,)
In [249]: data['CODE']                                                                    
Out[249]: array(['HOU', 'ABQ', 'BWI'], dtype='<U3')

Результатом является структурированный массив - 1d с 2 полями, доступ к которым осуществляется по имени.

С str dtype он также структурирован, но dtype - это 'U', строка из 0 байтов, поэтому отображается пустая строка:

In [250]: data = np.genfromtxt(txt.splitlines(), delimiter=',', dtype=str, names=True, enc
     ...: oding=True)                                                                     
In [251]: data                                                                            
Out[251]: 
array([('', ''), ('', ''), ('', '')],
      dtype={'names':['CODE','AIRPORT'], 'formats':['<U','<U'], 'offsets':[0,0], 'itemsize':2})

Обычная print опускает dtype с возможной путаницей:

In [252]: print(data)                                                                     
[('', '') ('', '') ('', '')]
...