【问题标题】:TypeError manipulating array in NumPyTypeError 在 NumPy 中操作数组
【发布时间】:2014-10-09 13:52:11
【问题描述】:

我在单独的 .txt 文件中有以下字符串:

L#$KJ#()JSEFS(DF)(SD*F
#KJ$H#K$JH@#K$JHD)
SF SDFLKJ#{P@$OJ{SDPFODS{PFO{
#K$HK#JHSFHD(*SHF)SF{HP
#L$H@”#$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 编写了这个脚本,以逐行创建数组数组,但出现“TypeError:列表索引必须是整数,而不是元组”

这是我尝试打印第一列时的脚本:

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]

我做错了什么?

【问题讨论】:

  • 看起来行的长度并不相同。如果是这种情况,数组将无济于事。我建议将其视为字符串列表,并进行列表循环、理解和字符串索引。

标签: python arrays numpy


【解决方案1】:

y[:, 1]y[(slice(None, None, None), 1)] 的语法糖,这使您更明显地尝试将 tuple 传递给 y.__getitem__

由于ylist,因此不起作用1

也许你的意思是:

y[:1]

选择前两项?

1(它确实适用于尺寸正确的numpy.ndarray,这可能会导致您的困惑)

【讨论】:

  • 那我如何访问这些列?
  • @rahul2001 -- 这是一个列表,没有列。如果每行的元素数量一致,那么您可以将其设为 numpy 数组,一切都会好的。 . .但是,您不满足该约束。你想做什么?
  • 好的,谢谢——这意味着我需要为每行添加一个空元素或其他内容,以满足创建 numpy 数组所需的元素数量?有没有办法创建一个可以自动填充缺失元素的矩阵?
  • 据我所知,不存在执行此操作的函数。但编写自己的应该不会太难。根据您的应用程序,也许掩码数组会有所帮助? stackoverflow.com/a/14916455/748858
【解决方案2】:

从您的文本txt 开始,我可以将其拆分为行,然后使用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)]

或者如果我指定一个 '_' 填充值:

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 x 10):

np.array(X)

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

您可以对每个元组、字符串或行进行频率计数。

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 2016-06-06
    • 2018-11-30
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多