2016-07-15 56 views
0

我從文件中讀取數據,就像這樣:鑄造蟒蛇名單numpy的陣列給出了錯誤的形狀

f = open('some/file/path') 
data = f.read().split('\n') 

這給了我像data = ['1 a #', '3 e &'] 如果原始文件是

1一個#

3e的&

我需要它的形式像

[['1','a','#'],['3','e','&']]

,這樣我就可以做一個np.swapaxes()它,把它變成

[['1','3'],['a','e'],['#','&']]

但每當我不這樣做,swapaxes呼叫失敗,這是因爲我沒有結束正確形狀的數組。要打開字​​符串轉換爲字符串列表,我做的:

for n in range(len(data)): data[n] = data[n].split() 
data = np.array(data) 

但是當我檢查形狀:

np.shape(data) 
>>>(2,) 

所以我不能換軸。我試過用幾種不同的方法來做numpy數組,但似乎所有東西都創建了一個numpy數組,它不知道數組內部還有另一個維數。

+0

重新看一下'data'的內容。你確定它符合你的想法嗎?這聽起來像你的文件可能以'\ n''結尾,將字符視爲行*終止符*而不是行*分隔符*。 – user2357112

回答

0

要打開data = ['1 a #', '3 e &'][['1','a','#'],['3','e','&']]你應該做的:

>>> data2 = [] 
>>> for line in data: 
    data2.append(line.split()) 


>>> data2 
[['1', 'a', '#'], ['3', 'e', '&']] 
+0

這不起作用。我仍然認爲numpy認爲是一個軸的數組。 – Anonymous

+0

好吧,我告訴你如何將它轉換成你要求的列表,沒有經驗與numpy不幸的 – iScrE4m

0

首先拆分字符串:

import numpy as np 
data = ['1 a #', '3 e &'] 
np.array([x.split() for x in data]).T 
0

你的線裂痕看起來不錯

In [110]: data = ['1 a #', '3 e &'] 

In [111]: for n in range(len(data)): data[n] = data[n].split() 

In [112]: data 
Out[112]: [['1', 'a', '#'], ['3', 'e', '&']] 

In [113]: A=np.array(data) 

In [114]: A 
Out[114]: 
array([['1', 'a', '#'], 
     ['3', 'e', '&']], 
     dtype='<U1') 

In [115]: A.shape 
Out[115]: (2, 3) 

In [116]: A.T 
Out[116]: 
array([['1', '3'], 
     ['a', 'e'], 
     ['#', '&']], 
     dtype='<U1') 

In [117]: A.T.tolist() 
Out[117]: [['1', '3'], ['a', 'e'], ['#', '&']] 

我可以 '轉置' 一個列表也有zip

In [119]: list(zip(*data)) 
Out[119]: [('1', '3'), ('a', 'e'), ('#', '&')] 

原始列表的分裂也可以用一個列表理解

In [120]: [i.split() for i in ['1 a #', '3 e &']] 
Out[120]: [['1', 'a', '#'], ['3', 'e', '&']] 

你可能已經聯合文件中讀取並且用類似

[i.strip().split() for i in f.readlines()] 

readlines拆分完成返回行的列表,但他們仍然包括\n,其中strip刪除。另外要注意的是數據線

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

在外殼之間的空白行,目前還不清楚,

In [122]: data = ['1 a #', '3 e &'] 

In [123]: np.array(data) 
Out[123]: 
array(['1 a #', '3 e &'], 
     dtype='<U5') 

產生2元素數組,其中每個元素是5個字符的字符串。重塑或移調不會將其轉換爲單個元素字符串的數組。你可以重塑成其他2元陣列

In [124]: _.reshape(2,1) 
Out[124]: 
array([['1 a #'], 
     ['3 e &']], 
     dtype='<U5') 

In [125]: __.reshape(1,2,1) 
Out[125]: 
array([[['1 a #'], 
     ['3 e &']]], 
     dtype='<U5') 

我能view它作爲一個單一的字符數組:

In [128]: A.view('<U1') 
Out[128]: 
array(['1', ' ', 'a', ' ', '#', '3', ' ', 'e', ' ', '&'], 
     dtype='<U1') 

In [129]: A.view('<U1').reshape(5,2) 
Out[129]: 
array([['1', ' '], 
     ['a', ' '], 
     ['#', '3'], 
     [' ', 'e'], 
     [' ', '&']], 
     dtype='<U1') 

,但在路上那些空白字符得到。

還存在適用字符串函數到陣列庫:

np.concatenate(np.char.split(A)).reshape(2,3) 
0

讀文件(條()將刪除「\ N」): filename="some/file/path" data=[i.strip().split(' ') for i in open(filename)] print(data) 轉換列表以numpy的陣列和交換axis: import numpy as np print(np.asarray(data)) print(np.asarray(data).T)

+0

這似乎並沒有工作。 'np.shape(data)'給了我'(2244,)',交換軸什麼也不做 – Anonymous

+0

我認爲你的文件中可能會有一些特殊的東西。我嘗試用我的python3,它運作良好。如果你嘗試np.shape(data)並且它給你(2244,),我認爲你最好檢查你的閱讀文件步驟,因爲看起來數據沒有被正確讀取。你能打印一些關於你的輸入文件的信息嗎?另外,我也嘗試np.swapaxes(data,0,1),它也可以。 – upceric