2016-04-14 82 views
0

我試圖繪製使用numpy,並輸入一個CCDFcsv#keywordscol[0]和頻率爲col[1]IndexError:太多的指數數組numpy的繪圖CCDF與CSV

輸入

#Car,45 
#photo,4 
#movie,6 
#life,1 

輸入具有10K以上的行和兩列的外面col[0]完全不使用,並且只從col[1]頻率用來繪製CCDF。數據中間沒有空行,也沒有任何空白行。

代碼:

import numpy as np 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.pyplot as plt 
from pylab import* 
import math 
from matplotlib.ticker import LogLocator 

data = np.genfromtxt('input.csv', delimiter=",") 

d0=data[:,1] 
X0 = np.sort(d0) 
cdf0 = np.arange(len(X0))/float(len(X0)) 
#cumulative = np.cumsum(data) 
ccdf0 = 1 - cdf0 
plt.plot(X0,ccdf0, color='b', marker='.', label='Frequency') 

plt.legend(loc='upper right') 
plt.xlabel('Freq (x)') 
plt.ylabel('ccdf(x)') 
plt.gca().set_xscale("log") 
#plt.gca().set_yscale("log") 
plt.show() 

錯誤

Traceback (most recent call last): 
    File "00_plot_ccdf.py", line 17, in <module> 
    d0=data[:,1] 
IndexError: too many indices for array 

由於提前

回答

2

genfromtxt通過啓動#作爲註釋默認對待線,所以實際上你data是空的:

In [1]: genfromtxt('test.csv', delimiter=',')   
/usr/lib/python3/dist-packages/numpy/lib/npyio.py:1385: UserWarning: genfromtxt: Empty input file: "test.csv" 
    warnings.warn('genfromtxt: Empty input file: "%s"' % fname) 
Out[1]: array([], dtype=float64) 

data是一維空數組,因此[:,1]的索引太多。

要禁用此通comments=Nonegenfromtxt

In [20]: genfromtxt('test.csv', delimiter=',', comments=None) 
Out[20]: 
array([[ nan, 45.], 
     [ nan, 4.], 
     [ nan, 6.], 
     [ nan, 1.]]) 

既然你只需要2列,還可以將搜索結果限於直接:

In [21]: genfromtxt('test.csv', delimiter=',', comments=None, usecols=(1,)) 
Out[21]: array([ 45., 4., 6., 1.]) 
+0

太感謝你了..讓我試試這個,並會回覆..再次感謝! :) –

+0

工程就像一個魅力..非常感謝你..一直在尋找很多。也可能是我可以對這一個使用一點建議。 http://stackoverflow.com/questions/36616118/seasborn-distplot-goes-unresponsive –

+1

@SitzBlogz ipython有一個很好的功能:在類,函數等後輸入問號並輸入(例如'genfromtxt?'),它會顯示有用的信息。這對於numpy,scipy等東西來說特別好,因爲它打印了一個非常類似於幫助文本的matlab。 –