Как импортировать данные с тем же именем столбца с помощью np.genfromtxt?

У меня есть данные в файле data.dat вида:

column_1    col col col col col
1   2   3   1   2   3
4   3   2   3   2   4
1   4   3   1   4   3
5   6   4   5   6   4

И я пытаюсь импортировать, используя np.genfromtxt, так что все данные с именем столбца col хранятся в переменной y. Я попробовал это с помощью кода:

import numpy as np
data = np.genfromtxt('data.dat', comments='#', delimiter='\t', dtype=None, names=True).transpose()
y = data['col']

Но это дает мне следующую ошибку:

ValueError: two fields with the same name

Как это можно решить в Python?

1 ответ

Решение

Когда вы используете name=True, np.genfromtxt возвращает структурированный массив. Обратите внимание, что столбцы помечены col в data.dat разобраться с именами столбцов формы col_n:

In [114]: arr = np.genfromtxt('data', comments='#', delimiter='\t', dtype=None, names=True)

In [115]: arr
Out[115]: 
array([(1, 2, 3, 1, 2, 3), (4, 3, 2, 3, 2, 4), (1, 4, 3, 1, 4, 3),
       (5, 6, 4, 5, 6, 4)], 
      dtype=[('column_1', '<i8'), ('col', '<i8'), ('col_1', '<i8'), ('col_2', '<i8'), ('col_3', '<i8'), ('col_4', '<i8')])

Так что, как только вы используете names=True становится сложнее выбрать все данные, связанные с именем столбца col, Более того, структурированный массив не позволяет разделять несколько столбцов одновременно. Таким образом, было бы удобнее вместо загрузки данных в массив однородного dtype (что вы получите без names=True):

with open('data.dat', 'rb') as f:
    header = f.readline().strip().split('\t')
    arr = np.genfromtxt(f, comments='#', delimiter='\t', dtype=None)

Затем вы можете найти числовой индекс тех столбцов, чье имя col:

idx = [i for i, col in enumerate(header) if col=='col']

и выберите все данные с помощью

y = arr[:, idx]

Например,

import numpy as np

with open('data.dat', 'rb') as f:
    header = f.readline().strip().split('\t')
    arr = np.genfromtxt(f, comments='#', delimiter='\t', dtype=None)
    idx = [i for i, col in enumerate(header) if col=='col']
    y = arr[:, idx]
    print(y)

доходность

[[2 3 1 2 3]
 [3 2 3 2 4]
 [4 3 1 4 3]
 [6 4 5 6 4]]

Если ты хочешь y чтобы быть одномерным, вы могли бы использовать ravel():

print(y.ravel())

доходность

[2 3 1 2 3 3 2 3 2 4 4 3 1 4 3 6 4 5 6 4]
Другие вопросы по тегам