一般问题: 我尝试使用matrix.T转置一个大的numpy矩阵。使用小型测试文件时效果很好。但是,当使用大文件时,只有前3行和后3行被转置,但它们之间的行(总共约250,000)不是转置的,而是打印为' ...'。此外,仅显示每行的第一个和最后3个核苷酸。最后,它看起来像是:
[[' C' ' T' ' C' ......,' A' ' C' ' T&#39]
[' C' ' T' ' A' ......,' A' ' T' ' G&#39]
[' C' ' T' ' A' ......,' G' ' C' ' A']
...,
[' T' ' A' ' A' ......,' G' ' A' ' T&#39]
[' T' ' A' ' A' ......,' C' ' G' ' T&#39]
[' C' ' G' ' T' ......,' A' ' A' ' G']]
这是我的代码:
import numpy as np
with open("temp1.txt","rt") as infile:
matrix = np.matrix([list(line.strip()) for line in infile.readlines()])
x = matrix.T
file_temp2.write(str(x))
说明: 1。 temp1.txt包括〜250,000个DNA序列,长度为100个核苷酸(A,C,T和G)。这些行用" \ n"分隔。在100个核苷酸之后。第一行看起来像这样:
CCCTAAACCCTAAACCCTAAACCCTAAACCTCTGAATCCTTAATCCCTAAATCCCTAAATCTTTAAATCCTACATCCATGAATCCCTAAATACCTAATTC TTTATGTTTGGACATTTATTGTCATTCTTACTCCTTTGTGGAAATGTTTGTTCTATCAATTTATCTTTTGTGGGAAAATTATTTAGTTGTAGGGATGAAG CAAAGTTCTTCCGCCTGATTAATTATCCATTTTACCTTTGTCGTAGATATTAGGTAATCTGTAAGTCAACTCATATACAACTCATAATTTAAAATAAAAT AAAAAAGTTGTAATTATTAATGATAGTTCTGTGATTCCTCCATGAATCACATCTGCTTGATTTTTCTTTCATAAATTTATAAGTAATACATTCTTATAAA TATATGGAAGATGTGAATGAAGTTTTGGTCCTGAATGTGGCCAAGGTTCCGTCATTTGGAGATACGAAATCAAATCTCCTTTAAGATTTTGTTTTTATAA
等等
2。 temp1.txt被转换为numpy矩阵并最终转置,使用测试文件(仅包含10个序列)可以正常工作。但是,在大文件中,当转置时会出现上述一般问题。
解决方案:?吗 您是否知道如何将大文件的完整转置矩阵最终写入我的temp2.txt进行进一步分析。
!!!找到解决方案: 最后,我发现在保存之前我必须将矩阵转换为列表。在写入文件之前,我必须先做y = np.array(x)[0:]。tolist()。现在它正在运作。现在的代码是:
import numpy as np
with open("temp1.txt","rt") as infile:
matrix = np.matrix([list(line.strip()) for line in infile.readlines()])
x = matrix.T
y = np.array(x)[0:].tolist()
z = str(y).replace("], [", "\n")
file_temp2.write(str(z))
答案 0 :(得分:2)
您的问题有效:请考虑
import numpy as np
x = np.asmatrix(np.arange(10)) #already np.arange behaves like this
y = np.asmatrix(np.arange(10000))
In [361]: str(x)
Out[361]: '[[0 1 2 3 4 5 6 7 8 9]]'
In [362]: str(y)
Out[362]: '[[ 0 1 2 ..., 9997 9998 9999]]'
更糟糕的是,numpy特定方法numpy.array_str()
遇到了同样的行为:
In [379]: np.array_str(np.asarray(x))
Out[379]: '[[0 1 2 3 4 5 6 7 8 9]]'
In [380]: np.array_str(np.asarray(y))
Out[380]: '[[ 0 1 2 ..., 9997 9998 9999]]'
我建议查看numpy.tofile()
:
In [381]: x.tofile("out.txt",sep=" ")
In [382]: y.tofile("out2.txt",sep=" ")
您可以使用它以所需的格式输出字符串。生成的文件包含(在我的情况下,数字)数组作为纯文本:
$ wc out*.txt
0 10000 48889 out2.txt
0 10 19 out.txt
bash命令wc
的上述输出在第二列中表示out.txt
包含10个单词,而out2.txt
包含10000个单词。目视检查验证结果是否正常。
答案 1 :(得分:0)
如果你的问题描述已经完成,你可以试试这样的事情:
result = []
fin = open("c:/temp/temp.txt","r")
fout = open("c:/temp/temp2.txt","w")
for line in fin:
result.append(tuple(line.strip())) #break into characters
for line in zip(*result): #transpose
fout.write("".join(line)) #join characters as string
fout.write("\n")