Как построить данные в Python из файла, где первый столбец является строкой, а второй столбец является числом? - PullRequest
0 голосов
/ 20 октября 2018

Предположим, у меня есть файл с именем FARM со следующими данными

pigs 23
horses 10
cows 35
goats 20
sheep 22
chickens 62
roosters 5

Я хотел бы построить эти данные со следующим результатом

enter image description here

Следующий код делает именно то, что я хочу

import matplotlib.pyplot as plt
import numpy as np
a,b = np.genfromtxt('FARM', usecols=(0,1), unpack=True, delimiter=' ', dtype='str')

x=[]
for i in a:
   x.append(i)

y=[]
for i in b:
   y.append(int(i))

plt.plot(x,y,'s')
plt.show()

Мой вопрос: есть ли прямой способ получить x и y из np.genfromtxt, или мне нужно конвертировать из a и b, как я это сделал?

Если бы можно было установить dtype выборочно для каждого столбца, я бы получил то, что хотел.Но я не смог понять, как это сделать.

После дальнейших размышлений, принимая во внимание комментарии и ответы, я думаю, что более интуитивно понятный способ построения столбцов с разными типами данных из одного файла:сделать два вызова np.genfromtxt, каждый из которых извлекает один столбец, а затем действует обычным образом, следующим образом:

x = np.genfromtxt('FARM', usecols=(0),  unpack=True,  dtype='str')                 
y = np.genfromtxt('FARM', usecols=(1),  unpack=True,  dtype='int')        

plt.plot(x,y,'s')
plt.show()

Таким образом, никаких специальных преобразований не требуется.

1 Ответ

0 голосов
/ 20 октября 2018

Существует прямой способ получения отдельных типов данных непосредственно из файла.Для этого вы должны использовать dtype=None.При этом dtypes по умолчанию будут сохранены.Будет создан список кортежей, который можно разбить на два подсписка x и y с помощью zip, а затем непосредственно построить.

data = np.genfromtxt('FARM', usecols=(0,1), delimiter=' ', dtype=None)
x, y = list(zip(*data))
plt.plot(x,y,'s')

enter image description here

Альтернативой вашему подходу будет непосредственное использование map для преобразования строк в int вместо использования цикла for.

a,b = np.genfromtxt('FARM', usecols=(0,1), unpack=True, delimiter=' ', dtype='str')

y = list(map(int, b))
plt.plot(a,y,'s')
...