【问题标题】:numpy matrix is not completely transposed [closed]numpy矩阵没有完全转置[关闭]
【发布时间】:2016-01-02 21:37:17
【问题描述】:

一般问题: 我尝试使用 matrix.T 转置一个大的 numpy 矩阵。使用小型测试文件时效果很好。但是,当使用大文件时,只有前 3 行和后 3 行被转置,但中间的行(总共约 250,000 行)没有被转置并且打印为“...”。此外,每行仅显示第一个和最后 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 个 DNA 序列,长度为 100 个核苷酸(A、C、T 和 G)。这些行在 100 个核苷酸之后用“\n”分隔。第一行如下所示:

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

【问题讨论】:

  • 我认为它是转置的。但是这 3 个点只是演示(防止在屏幕上打印巨大的矩阵)
  • 您希望str(x) 用于大型矩阵吗?
  • @itai:谢谢,但我忘了说这不是屏幕上显示的内容。这就是 temp2.​​txt 文件的内容。 temp2.​​txt只有2KB大小,这也说明里面什么都没有了。
  • @Alan:一个巨大的 250,000 X 100 矩阵(这可能吗?)。使用它工作的测试文件(生成一个 10 X 100 的矩阵)。

标签: python arrays numpy matrix transpose


【解决方案1】:

你的问题是有效的:考虑

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,它们应该如此。目视检查确认结果正常。

【讨论】:

  • 非常感谢。我也会试试的。但是,在您发布此帖子期间,我找到了解决方案。请参阅我的问题末尾的“!!!找到解决方案”。不过,谢谢!
  • @saanasum 是的,谢谢,我已经看到了:) 您的解决方案主要基于这样一个事实,即只有 np.arrays 会产生此问题,但使用带有 列表的 str(x) x 包含所有元素。我认为您可以/应该避免整个np.matrix 业务,并直接读入您喜欢的列表。当然,除非您需要一个用于中间操作的矩阵。
  • @Andras Deak:主要目标是确定每个序列中每个位置的每个核苷酸(A、C、T 或 G)的数量。所以最后,在 250,000 个序列中有 100 个位置。这个想法是生成矩阵以便能够转置它。转置后的矩阵可以转化为列表或字符串,计算每一行中每个核苷酸的个数(与输入文件(temp1.txt)中每一行的计数相同)。
【解决方案2】:

如果您的问题描述完整,您可以尝试以下方法:

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

【讨论】:

  • 哇!那太棒了。谢谢!换位工作。所以 numpy 是没有必要的。但是,temp2.​​txt 中缺少每个 DNA 序列后的“\n”。但这可能是一个小问题。
  • 也许你丢失了最后一行(上图)的缩进?
  • @Alan:存在缩进。但是,我在这样做时得到了它: for line in zip(*result): #transpose line = "".join(line) #join characters as string line = line+"\n" fout.write(str(line))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多