2015-02-08 52 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數組。 – 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

回答

0
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,它將返回壓縮列表的迭代器,而不是顯式構建它們。

0

當找你做數學,您通常使用numpy包的ndarray對象,它特別允許這種類型的索引:

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