2014-10-08 56 views
1

操縱陣列I具有在一個單獨的.txt文件以下字符串:類型錯誤在NumPy的

L#$KJ#()JSEFS(DF)(SD*F 
#KJ$H#[email protected]#K$JHD) 
SF SDFLKJ#{[email protected]$OJ{SDPFODS{PFO{ 
#K$HK#JHSFHD(*SHF)SF{HP 
#[email protected]」#$H」@#L$KH#」@L$K 
#~L$KJ#:$SD)FJ)S(DJF)(S 
#$KJH#$ 
SDLKFJD(FJ)SDJFSDLFKS 
~L#$KJ:@LK$#J$ 
LSJDF(S*JDF(*SJDF(*J(DSF*J 

我具有由列位置,並輸出到利用每一個元件多少次的元素出現的一列。例如,位置:0或列1(S:20.0%#:50.0%L:20.0%〜:10.0%)

我已經用python編寫了這個腳本,使用NumPy按行創建了一個數組,得到「類型錯誤:列表索引必須是整數,而不是元組」

這裏是腳本,當我嘗試打印的第一列:

import numpy as np 
from sys import argv 

script, filename = argv 

target = open(filename, 'r') 

y = [] 
for x in range(0, 10): 
    y.append(np.array(list(target.readline()))) 

print y[:,1] 

我在做什麼錯?

+0

它看起來不像行都是相同的長度。如果是這種情況,陣列不會幫助。我建議把它當作一個字符串列表,並做列表循環,理解和字符串索引。 – hpaulj 2014-10-09 03:07:59

回答

0

y[:, 1]是合成糖y[(slice(None, None, None), 1)]這使得它更明顯,你試圖通過tuple到。

由於ylist,不工作

也許你的意思是:

y[:1] 

其中挑選出的前兩個項目?

(它確實與正常尺寸numpy.ndarray工作,這可能會引起你的困惑)與你的文字,txt

+0

那麼我如何訪問列? – rahul2001 2014-10-09 00:17:16

+0

@ rahul2001 - 這是一個列表,那裏沒有列。如果每行有一個一致的元素,那麼你可以使它成爲一個numpy數組,並且都可以。 。但是,你不能滿足這個約束。你想做什麼? – mgilson 2014-10-09 00:21:00

+0

好的,謝謝 - 這意味着我需要添加一個空元素或每行的東西,以滿足創建一個numpy數組所需的元素數量?有沒有辦法創建一個可以自動填充缺失元素的矩陣? – rahul2001 2014-10-09 00:24:57

0

開始,我可以把它分割成線,並使用zip(*lines)重新安排他們成'專欄'。由於線路長度不同,我將使用itertools.izip_longest

lines = txt.splitlines() 
[l for l in itertools.izip_longest(*lines)] 

生產:

[('L', '#', 'S', '#', '#', '#', '#', 'S', '~', 'L'), 
('#', 'K', 'F', 'K', 'L', '~', '$', 'D', 'L', 'S'), 
('$', 'J', ' ', '$', '$', 'L', 'K', 'L', '#', 'J'), 
... 
(None, None, 'O', None, 'K', None, None, None, None, None), 
(None, None, '{', None, None, None, None, None, None, None)] 

或者,如果我指定一個 '_' fillvalue:

X=[l for l in itertools.izip_longest(*lines, fillvalue=' ')] 

[('L', '#', 'S', '#', '#', '#', '#', 'S', '~', 'L'), 
('#', 'K', 'F', 'K', 'L', '~', '$', 'D', 'L', 'S'), 
('$', 'J', ' ', '$', '$', 'L', 'K', 'L', '#', 'J'), 
('K', '$', 'S', 'H', 'H', '$', 'J', 'K', '$', 'D'), 
('J', 'H', 'D', 'K', '@', 'K', 'H', 'F', 'K', 'F'), 
... 
(' ', ' ', 'P', ' ', 'L', ' ', ' ', ' ', ' ', 'J'), 
(' ', ' ', 'F', ' ', '$', ' ', ' ', ' ', ' ', ' '), 
(' ', ' ', 'O', ' ', 'K', ' ', ' ', ' ', ' ', ' '), 
(' ', ' ', '{', ' ', ' ', ' ', ' ', ' ', ' ', ' ')] 

或列表等長字符串:

[''.join(x) for x in X] 

或字符數組(29×10):

np.array(X) 

array([['L', '#', 'S', '#', '#', '#', '#', 'S', '~', 'L'], 
     ['#', 'K', 'F', 'K', 'L', '~', '$', 'D', 'L', 'S'], 
     ['$', 'J', ' ', '$', '$', 'L', 'K', 'L', '#', 'J'], 
     ... 
     [' ', ' ', '{', ' ', ' ', ' ', ' ', ' ', ' ', ' ']], 
     dtype='|S1') 

你可以做的每個元組,字符串或行的頻率計數。