2015-02-08 2 views
0

Я немного новичок в python (переключение с IDL), поэтому я извиняюсь, если не использую правильную терминологию. Я пробовал искать аналогичные questions, но, похоже, не понял. У меня есть два списка, и я пытаюсь создать гистограмму данных, где dat2 = 1. Я пытался делать это несколько способов, и он продолжает давать мне TypeErrorСписок индексов с другим списком? - Python 2.7

import matplotlib.pyplot as plt 
import numpy as np 
data = [1.1,4.2,5.3,8.6,10.0,1.2,41.4,23.2] 
dat2 = [1,1,1,1,2,2,2,2] 
ind = [i for i,v in enumerate(dat2) if v==1] 
bins = np.arange(0,45,5) 
plt.hist(data[ind],bins) 

Точки ошибок в Hist () и говорит: «TypeError: индексы списка должны быть целыми числами, а не списком». Я пробовал ind=map(int,ind) и ind=[int(i) for i in ind] без везения.

+0

То, что вы пытаетесь сделать, это возможно с NumPy массивы, так что лучше инициализировать ' data' и 'dat2' как массивы NumPy. –

+0

Я не уверен, как это сделать, если я читаю данные из текстового файла? – edub

+0

NumPy предоставляет такие функции, как ['loadtxt'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html) и [' genfromtxt'] (http: //docs.scipy. org/doc/numpy/reference/generated/numpy.genfromtxt.html # numpy.genfromtxt) для загрузки данных из файлов в массивы NumPy, если они недостаточно хороши, тогда вы можете преобразовать свои списки в массивы NumPy, вызвав ['array () '] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html). –

ответ

0
data = [ d1 for (d1, d2) in zip(data, dat2) if d2 == 1 ] 
plt.hist(data) 

Это молниеносно data и dat2 вместе, создавая список кортежей [ (1.1, 1), (4.2, 1) ... ]. Затем вы можете использовать понимание списка, чтобы сохранить только те кортежи, вторым элементом которых является 1.

Наконец, если списки должны быть достаточно длинными для того, чтобы память была проблемой, вы можете заменить zip на itertools.izip, который возвращает итератор для зашифрованных списков, а не строит их явно.

0

Когда you'r делать математику, вы обычно используете ndarray объект в numpy ПАКЕТ, которая специально позволяет такого рода индексации:

data = np.array(data) 
... 
data[ind] 
Смежные вопросы