索引列表与另一个列表? - Python 2.7

问题描述:

我对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数组。 – 2015-02-08 22:05:29

+0

如果我正在阅读文本文件中的数据,我不知道该怎么做? – edub 2015-02-08 22:08:03

+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数组,如果它们不够好,则可以通过调用['array( )'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html)。 – 2015-02-08 22:11:18

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

这种拉链datadat2在一起,创建的元组[ (1.1, 1), (4.2, 1) ... ]的列表。然后,您可以使用列表理解来仅保留第二个元素为1的元组。

最后,如果列表足够长以便内存成为问题,则可以用itertools.izip替换zip,它将返回压缩列表的迭代器,而不是显式构建它们。

当找你做数学,您通常使用numpy包的ndarray对象,它特别允许这种类型的索引:

data = np.array(data) 
... 
data[ind]