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