2010-04-12 17 views
0

我有一個python函數,它可以隨機化表示位置特定計分矩陣的字典。 例如:python隨機函數在分配給列表或直接調用時的行爲不同

mat = { 
     'A' : [ 0.53, 0.66, 0.67, 0.05, 0.01, 0.86, 0.03, 0.97, 0.33, 0.41, 0.26 ] 
     'C' : [ 0.14, 0.04, 0.13, 0.92, 0.99, 0.04, 0.94, 0.00, 0.07, 0.23, 0.35 ] 
     'T' : [ 0.25, 0.07, 0.01, 0.01, 0.00, 0.04, 0.00, 0.03, 0.06, 0.12, 0.14 ] 
     'G' : [ 0.08, 0.23, 0.20, 0.02, 0.00, 0.06, 0.04, 0.00, 0.54, 0.24, 0.25 ] 
     } 

的scambling功能:

def scramble_matrix(matrix, iterations): 
    mat_len = len(matrix["A"]) 
    pos1 = pos2 = 0 
    for count in range(iterations): 
     pos1,pos2 = random.sample(range(mat_len), 2) 
     #suffle the matrix: 
     for nuc in matrix.keys(): 
      matrix[nuc][pos1],matrix[nuc][pos2] = matrix[nuc][pos2],matrix[nuc][pos1] 
    return matrix 

def print_matrix(matrix): 
for nuc in matrix.keys(): 
    print nuc+"[", 
    for count in matrix[nuc]: 
     print "%.2f"%count, 
    print "]" 
現在

的問題...... 當我嘗試直接爭搶一個矩陣,它的正常工作:

print_matrix(mat) 
print "" 
print_matrix(scramble_matrix(mat,10)) 

給出:

A[ 0.53 0.66 0.67 0.05 0.01 0.86 0.03 0.97 0.33 0.41 0.26 ] 
C[ 0.14 0.04 0.13 0.92 0.99 0.04 0.94 0.00 0.07 0.23 0.35 ] 
T[ 0.25 0.07 0.01 0.01 0.00 0.04 0.00 0.03 0.06 0.12 0.14 ] 
G[ 0.08 0.23 0.20 0.02 0.00 0.06 0.04 0.00 0.54 0.24 0.25 ] 

A[ 0.41 0.97 0.03 0.86 0.53 0.66 0.33.05 0.67 0.26 0.01 ] 
C[ 0.23 0.00 0.94 0.04 0.14 0.04 0.07 0.92 0.13 0.35 0.99 ] 
T[ 0.12 0.03 0.00 0.04 0.25 0.07 0.06 0.01 0.01 0.14 0.00 ] 
G[ 0.24 0.00 0.04 0.06 0.08 0.23 0.54 0.02 0.20 0.25 0.00 ] 

但是當我嘗試將這個加擾分配給一個列表時,它不起作用! ...

print_matrix(mat) 
s=[] 
for x in range(3): 
    s.append(scramble_matrix(mat,10)) 
for matrix in s: 
    print "" 
    print_matrix(matrix) 

結果

A[ 0.53 0.66 0.67 0.05 0.01 0.86 0.03 0.97 0.33 0.41 0.26 ] 
C[ 0.14 0.04 0.13 0.92 0.99 0.04 0.94 0.00 0.07 0.23 0.35 ] 
T[ 0.25 0.07 0.01 0.01 0.00 0.04 0.00 0.03 0.06 0.12 0.14 ] 
G[ 0.08 0.23 0.20 0.02 0.00 0.06 0.04 0.00 0.54 0.24 0.25 ] 

A[ 0.01 0.66 0.97 0.67 0.03 0.05 0.33 0.53 0.26 0.41 0.86 ] 
C[ 0.99 0.04 0.00 0.13 0.94 0.92 0.07 0.14 0.35 0.23 0.04 ] 
T[ 0.00 0.07 0.03 0.01 0.00 0.01 0.06 0.25 0.14 0.12 0.04 ] 
G[ 0.00 0.23 0.00 0.20 0.04 0.02 0.54 0.08 0.25 0.24 0.06 ] 

A[ 0.01 0.66 0.97 0.67 0.03 0.05 0.33 0.53 0.26 0.41 0.86 ] 
C[ 0.99 0.04 0.00 0.13 0.94 0.92 0.07 0.14 0.35 0.23 0.04 ] 
T[ 0.00 0.07 0.03 0.01 0.00 0.01 0.06 0.25 0.14 0.12 0.04 ] 
G[ 0.00 0.23 0.00 0.20 0.04 0.02 0.54 0.08 0.25 0.24 0.06 ] 

A[ 0.01 0.66 0.97 0.67 0.03 0.05 0.33 0.53 0.26 0.41 0.86 ] 
C[ 0.99 0.04 0.00 0.13 0.94 0.92 0.07 0.14 0.35 0.23 0.04 ] 
T[ 0.00 0.07 0.03 0.01 0.00 0.01 0.06 0.25 0.14 0.12 0.04 ] 
G[ 0.00 0.23 0.00 0.20 0.04 0.02 0.54 0.08 0.25 0.24 0.06 ] 

問題是什麼??? 爲什麼第一次加擾不工作,並且所有列表都填充了相同的矩陣?!

+0

請注意,雖然你想使用這個生物信息學,這與問題無關。 – 2010-04-12 13:43:38

+0

如果你只是想要一個完整的原始數據洗牌,你可能只想使用random.shuffle – tom10 2010-04-12 13:53:13

回答

3

你正在洗牌相同的矩陣就地3次。但你真的想洗牌3個原始矩陣的副本。所以你應該這樣做:

from copy import deepcopy 

print_matrix(mat) 
s=[] 
for x in range(3): 
    s.append(scramble_matrix(deepcopy(mat),10)) # note the deepcopy() 
for matrix in s: 
    print "" 
    print_matrix(matrix) 
+0

謝謝! - 我認爲它解決了它 – 2010-04-12 14:16:37

4

您的擾碼函數正在修改現有的矩陣,它不會創建一個新的矩陣。

您創建一個矩陣,對其進行加擾並將其添加到列表中。然後你再次爭搶並再次將其添加到列表中。列表中的兩個元素現在都包含相同的矩陣對象,該對象被加擾兩次。

+0

+1:**相同對象**問題。好點。 – 2010-04-12 13:48:15

+0

是不是列表元素包含_references_到同一個對象? – 2010-04-12 13:52:14

相關問題