numpy矩阵没有完全转置

时间:2016-01-02 21:37:17

标签: python arrays numpy matrix transpose

一般问题: 我尝试使用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))

2 个答案:

答案 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")