2016-11-13 64 views
0

我試圖同化一堆信息爲可用的數組是這樣的:Python列表限制?

for (dirpath, dirnames, filenames) in walk('E:/Machin Lerning/Econ/full_set'): 
    ndata.extend(filenames) 
for i in ndata: 
    currfile = open('E:/Machin Lerning/Econ/full_set/' + str(i),'r') 
    rawdata.append(currfile.read().splitlines()) 
    currfile.close() 
rawdata = numpy.array(rawdata) 

for order,file in enumerate(rawdata[:10]): 
    for i in rawdata[order]: 
     r = i.split(',') 
     pdata.append(r) 
    fdata.append(pdata) 
    pdata = [] 
fdata = numpy.array(fdata) 
plt.figure(1) 
plt.plot(fdata[:,1,3]) 

編輯:使用前10個txt文件

for order,file in enumerate(rawdata[:10]): 

我看到它時,打印ftada.shape後是(10,500,7)。但是,如果我不限制這大小,而是說

for order,file in enumerate(rawdata): 

然後fdata.shape僅僅是(447) 好像發生這種情況時,我增加元素的數量我在期待通過rawdata數組到13以上...它不是任何具體的位置 - 我把它改爲

for order,file in enumerate(rawdata[11:24): 

並且工作正常。 aaaaahhh 在情況下,它是非常有用的:這裏是什麼樣的文本文件的樣本是這樣的:

20080225,A,31.42,31.79,31.2,31.5,30575 
20080225,AA,36.64,38.95,36.48,38.85,225008 
20080225,AAPL,118.59,120.17,116.664,119.74,448847 
+0

這個錯誤通常意味着您正在嘗試將二維數組視爲三維數組。這與數組中元素的數量無關。我懷疑你的問題與你如何寫最後一行有關,而不是代碼中的其他內容。 – Ouroborus

+0

您的代碼和異常不匹配(代碼中沒有'print'或'len')。它看起來並不像你執行你認爲的那樣的代碼。也許Anaconda存在緩存問題。 – Dunes

回答

2

貌似fdata是一個數組,而錯誤是fdata[:,1,3]。這試圖索引fdata與3個索引,切片,1和3.但如果fdata是一個二維數組,這將產生此錯誤 - too many indices

當你得到'索引'錯誤,找出違規數組的shape。不要只是猜測。添加調試語句print(fdata.shape)

===================

以你的文件樣本,如行的列表:

In [822]: txt=b"""20080225,A,31.42,31.79,31.2,31.5,30575 
    ...: 20080225,AA,36.64,38.95,36.48,38.85,225008 
    ...: 20080225,AAPL,118.59,120.17,116.664,119.74,448847 """ 
In [823]: txt=txt.splitlines() 

In [826]: fdata=[] 
In [827]: pdata=[] 

讀取一個 '文件' :

In [828]: for i in txt: 
    ...:  r=i.split(b',') 
    ...:  pdata.append(r) 
    ...: fdata.append(pdata) 
    ...: 
    ...:  
In [829]: fdata 
Out[829]: 
[[[b'20080225', b'A', b'31.42', b'31.79', b'31.2', b'31.5', b'30575 '], 
    ....]]] 
In [830]: np.array(fdata) 
Out[830]: 
array([[[b'20080225', b'A', b'31.42', b'31.79', b'31.2', b'31.5', 
     b'30575 '], 
...]]], 
     dtype='|S8') 
In [831]: _.shape 
Out[831]: (1, 3, 7) 

閱讀的「相同的文件」

In [832]: for i in txt: 
    ...:  r=i.split(b',') 
    ...:  pdata.append(r) 
    ...: fdata.append(pdata) 

In [833]: len(fdata) 
Out[833]: 2 
In [834]: np.array(fdata).shape 
Out[834]: (2, 6, 7) 
In [835]: np.array(fdata).dtype 
Out[835]: dtype('S8') 

注dtype - 8個字符的字符串。由於每行的值是一個字符串,因此它不能將整個事物轉換爲數字。

現在讀一個稍微不同的 '文件'(一個較小的線,一個更小的值)

In [836]: txt1=b"""20080225,A,31.42,31.79,31.2,31.5,30575 
    ...: 20080225,AA,36.64,38.95,36.48,38.85 """ 
In [837]: txt1=txt1.splitlines() 
In [838]: for i in txt1: 
    ...:  r=i.split(b',') 
    ...:  pdata.append(r) 
    ...: fdata.append(pdata) 

In [839]: len(fdata) 
Out[839]: 3 
In [840]: np.array(fdata).shape 
Out[840]: (3, 8) 
In [841]: np.array(fdata).dtype 
Out[841]: dtype('O') 

現在讓我們添加一個 '空' 文件 - 沒有行,以便pdata[]

In [842]: fdata.append([]) 
In [843]: np.array(fdata).shape 
Out[843]: (4,) 
In [844]: np.array(fdata).dtype 
Out[844]: dtype('O') 

陣列形狀和dtype已完全改變。它不能再從線上創建一個統一的3d陣列。

10個文件後面的形狀(10,500,7)表示10個文件,每行500行,每行7列。但是完整400中的一個或多個文件是不同的。我最後一次迭代表明一個是空的。

+0

看起來陣列的形狀隨着大小而變化?我不明白這一點! –

+0

也檢查dtype。一個或多個文件具有不同的佈局。 – hpaulj

+0

看起來像它只是我看通過的元素的數量... –