numpy 矩阵未完全转置

numpy matrix is not completely transposed

一般问题: 我尝试使用 matrix.T 转置一个大的 numpy 矩阵。它在使用小测试文件时运行良好。但是,当使用大文件时,只有前 3 行和后 3 行被转置,但中间的行(总共约 250,000 行)没有转置并打印为“...”。此外,每行仅显示前 3 个和后 3 个核苷酸。最后,它看起来像这样:

[['C' 'T' 'C' ..., 'A' 'C' 'T']

['C' 'T' 'A' ..., 'A' 'T' 'G']

['C' 'T' 'A' ..., 'G' 'C' 'A']

...,

['T' 'A' 'A' ..., 'G' 'A' 'T']

['T' 'A' 'A' ..., 'C' 'G' 'T']

['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 个长度为 100 个核苷酸(A、C、T 和 G)的 DNA 序列。这些行在 100 个核苷酸后用“\n”分隔。第一行看起来像这样:

CCCTAAACCCTAAACCCTAAACCCTAAACCTCTGAATCCTTAATCCCTAAATCCCTAAATCTTTAAATCCTACATCCATGAATCCCTAAATACCTATTC TTTATGTTTGGACATTTATTGTCATTCTTACTCCTTTGTGGAAATGTTTGTCTATCAATTTATCTTTTGTGGGAAAATTATTGTTGTAGGGATGAAG CAAAGTTCTTCCGCCTGATTAATTATCCATTTTACCTTTGTCGTAGATATTAGGTAATCTGTAAGTCAACTCATATACACTCATAATTTAAAATAAAAT AAAAAAGTTGTAATTATTAATGATAGTTCTGTGATTCCTCCATGAATCACATCTGCTTGATTTTTCTTTCATAATTTATAAGTAATACATTCTTATAA 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))

你的问题是有效的:考虑

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-specific 方法遇到了相同的行为 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 个单词,因为它们应该.目视检查确认结果正常。

如果您的问题描述完整,您可以尝试这样的操作:

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