2014-10-08 54 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') 

你可以做的每个元组,字符串或行的频率计数。