我是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
答案 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(',')
将字符串拆分为子字符串。并将float
或int
转换为数字,例如
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
。