在循环完成后存储每个迭代的数组

时间:2016-07-03 23:03:42

标签: python arrays numpy matrix

我是Python的新手。我已经广泛搜索了我的问题的解决方案,但我左右两端都是死路一条。

我使用以下代码生成了一系列数组:

fh = open(short_seq, 'r')
line_counter = 0
pos = [0]
array = [0.0 for x in range(101)]
for line in fh:
    line_counter += 1.0   
    for i in line:
        score = ord(i) - 33.0
        array[pos] += score
        pos += 1

在循环内打印后,我得到了一大串数组。

[1,2,3,4.....]
[2,3,4,5,6.....]
[3,4,5,6,7,8.....100]
...

我想使用NumPy在每个列上运行统计信息,在它们打印出来的特定对齐中,但是一旦我在循环之外,我只能调用整个循环的总和。我尝试了np.concatenate,但这仍然让我得到了数组的总和。如果我在循环中使用NumPy,那么我只能在每一列上运行统计数据,一次一次迭代,而不是整个系列。我的下一个想法是将每次迭代都添加到二维矩阵中,但我无法确定如何保持对齐。

非常感谢任何帮助。

编辑:这是我的数据样本(四个字符串中的每一个都在文本编辑器中的另一个下面)。我正在尝试将几千行ascii转换为数值。每行必须是100个字符长的数组,然后我需要在每列上运行统计信息。

CCCFFFFFHHHHHIJJJJJJIJJJJJJJJIJJJIJJJJJJJIJJIJJGIIIHIIIFGIGFHFGIIIHIHHGEHHFDFFFFFDDDDDBDDDDDDDDEDEEDD CCCFFFFFHHHHHJJJJJJJJJJIIIJJIGJJJJJJJJJJIJJJJJIJJJJJJIJIJJIJJIJJIJJHGHHHHFFCEFFFEEDAEEEFEEDDDB:ADDDD: CCCFFFFFHHHHHJIJJJIJJJIJJIJJIIJIIJJJJJJJJJJJJJIIJJJJJJJJJGHHHHFFFFFFEEEEEEEDDDDDEDDDDDDDDDDDDDDDDD> 9< BCCFFFDFHHHHHJJJJJJJJJJJIIJJJI @ HGIIIJJJJJIJJIJIIJJJJJJJJJHHHHHHFFFDDDDDDDDDDDDDDDD?BDDDD @ CDDDDDBDDDDD

1 个答案:

答案 0 :(得分:0)

array = [0.0 for x in range(101)]

是一个列表。 array = np.zeros((101,),float)是一个大小相同的数组。

使用for line in fh:,您会获得一行,一个字符串。我希望for i in line:迭代该字符串中的字符。这真的是你想要的吗?

for i in line:
    score = ord(i) - 33.0
    array[pos] += score
    pos += 1

通常,当人们阅读文本文件时,他们希望列的值用空格或逗号分隔,例如

 123, 345, 344, 233
 343, 342, 343, 343

我们使用lines.split(',')将字符串拆分为子字符串。并将floatint转换为数字,例如

 data = [float(substring) for substring in line.split(',')]

向我们展示一些您的数据文件或简化版本。它会更容易帮助。一个关键问题是,'列的数量是多少?线条一致。

通常当我们遍历数组的行时,我们会在列表中收集行值。如果子列表中的元素数量一致,我们可以将其转换为二维数组。

 lines = []
 for line in fh:
     data = [float(i) for i in line.split(',')]
     lines.append(data)
 print(lines)
 # A = np.array(lines) 

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

我可以使用您的样本行:

In [258]: with open('stack38175089.txt') as f:
    lines=f.readlines()
   .....:     

In [259]: [len(l) for l in lines]
Out[259]: [102, 102, 102, 102]

In [260]: data=np.array([[ord(i) for i in l.strip()] for l in lines])

In [261]: data.shape
Out[261]: (4, 101)

In [262]: data
Out[262]: 
array([[67, 67, 67, 70, 70, 70, 70, 70, 72, 72, 72, 72, 72, 73, 74, 74, 74,
        74, 74, 74, 73, 74, 74, 74, 74, 74, 74, 74, 74, 73, 74, 74, 74, 73,
        74, 74, 74, 74, 74, 74, 74, 73, 74, 74, 73, 74, 74, 71, 73, 73, 73,
        72, 73, 73, 73, 70, 71, 73, 71, 70, 72, 70, 71, 73, 73, 73, 72, 73,
        72, 72, 71, 69, 72, 72, 70, 68, 70, 70, 70, 70, 70, 68, 68, 68, 68,
        68, 66, 68, 68, 68, 68, 68, 68, 68, 68, 69, 68, 69, 69, 68, 68],
       ...
       [66, 67, 67, 70, 70, 70, 68, 70, 72, 72, 72, 72, 72, 74, 74, 74, 74,
        74, 74, 74, 74, 74, 74, 74, 73, 73, 74, 74, 74, 73, 64, 72, 71, 73,
        73, 73, 74, 74, 74, 74, 74, 73, 74, 74, 73, 74, 73, 73, 74, 74, 74,
        74, 74, 74, 74, 74, 74, 72, 72, 72, 72, 72, 72, 70, 70, 70, 68, 68,
        68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 63, 66, 68,
        68, 68, 68, 64, 67, 68, 68, 68, 68, 68, 66, 68, 68, 68, 68, 68]])

使用这样的2d数组,我可以轻松地移动值(-33),并对行或列应用统计计算。

我可以单独阅读这些行并在列表列表中收集这些值。但是这个样本,我怀疑你的整个文件,足够小,可以使用readlines