2016-01-02 53 views
1

一般問題: 我嘗試使用matrix.T轉置一個大的numpy矩陣。使用小型測試文件時它運行良好。然而,當使用大文件時,只有前3行和後3行被轉置,但其間的行(總共〜250,000)不會被轉置並被打印爲'...'。另外,每行僅顯示第一個和最後3個核苷酸。最後,它看起來就像是:numpy matrix沒有完全轉置

[ '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個核苷酸的DNA序列(A,C,T和G)。 100個核苷酸後用「\ n」分隔。第一線看起來像:

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

我認爲它轉。但3個點只是演示文稿(防止在屏幕上打印巨大的矩陣) – itai

+0

你認爲'str(x)'是一個大矩陣嗎? – Alan

+0

@itai:謝謝,但我忘了提及這不是屏幕上顯示的內容。這是temp2.​​txt文件的內容。 temp2.​​txt的大小隻有2KB,這也說明裏面沒有其他東西。 – saanasum

回答

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

哇!那很棒。謝謝!換位工作。所以numpy是沒有必要的。但是,temp2.​​txt中缺少每個DNA序列後的「\ n」。但這可能是一個小問題。 – saanasum

+0

也許你失去了最後一行(上圖)的縮進? – Alan

+0

@ Alan:縮進存在。不過,我這樣做的時候是這樣的:對於zip中的行(*結果):#transpose line =「」.join(line)#join characters as string line = line +「\ n」 fout.write(str線)) – saanasum

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,因爲他們應該。目視檢查證實結果是確定的。

+0

非常感謝。我也會嘗試。然而,在你發佈這篇文章的過程中,我發現了一個解決方案。在我的問題結尾處看到「找到解決方案」。不過,謝謝! – saanasum

+0

@saanasum是啊,謝謝,我已經看到了:)你的解決方案主要基於這樣一個事實,即只有'np.array's產生這個問題,但使用'str(x)'和* list *'x'包含每個元素。我認爲你可以/應該避免整個'np.matrix'事務,並直接讀入你喜歡的列表。當然,除非中間操作需要矩陣。 –

+0

@ Andras Deak:主要目標是確定每個序列中每個位置的每個核苷酸(A,C,T或G)的數量。最後,250,000個序列中有100個位置。這個想法是生成矩陣來轉置它。轉置後的矩陣可以轉換爲列表或字符串,以計算每行中每個核苷酸的數量(與輸入文件(temp1.txt)中每行計數相同)。 – saanasum