2014-09-18 237 views
1

我想生成一個矩陣,以對角方式移動值,我不熟悉數學術語,但是這必須是非常默認的。創建一個移位的矩陣

我試圖給我:

[(0, 0), (1, 1), (2, 2)] 
[(3, 0), (4, 1), (5, 2)] 
[(6, 0), (7, 1), (8, 2)] 

我想(注意遠離起點,價值越高,介意傾斜移動藏漢)

[(0, 0), (1, 1), (2, 2)] 
[(3, 1), (4, 1), (5, 2)] 
[(6, 2), (7, 2), (8, 2)] 

我曾嘗試使用collections.deque爲此目的,但它似乎不是要走的方式

回答

1

這裏的λ是一個一行生成你的第二個矩陣:

[[(3*i + j, abs(i-j) + min(i,j)) for j in range(3)] for i in range(3)] 

產生:

[[(0, 0), (1, 1), (2, 2)], 
[(3, 1), (4, 1), (5, 2)], 
[(6, 2), (7, 2), (8, 2)]] 
3

你需要編寫一個循環來處理移位並打開一個新的矩陣來接受移位(因爲元組是不可變的)。

matrix = [[(0, 0), (1, 1), (2, 2)], [(3, 0), (4, 1), (5, 2)], [(6, 0), (7, 1), (8, 2)]] 

shifted_matrix = [[] for _ in range(len(matrix))] 
for i in xrange(len(matrix)): 
    for j in xrange(len(matrix[i])): 
     if i-j >= 0: 
      shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1] + i-j)) 
     else: 
      shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1])) 

我不確切地知道你是什麼意思的'開始'矩陣,但我假設你想要一個函數,你可以調用任何矩陣?這裏的代碼被重新格式化爲接受一個矩陣作爲參數並返回一個移位的矩陣。

def diagonalize_matrix(matrix): 
    shifted_matrix = [[] for _ in range(len(matrix))] 
    for i in xrange(len(matrix)): 
     for j in xrange(len(matrix[i])): 
      if i-j >= 0: 
       shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1] + i-j)) 
      else: 
       shifted_matrix[i].append((matrix[i][j][0], matrix[i][j][1])) 
    return shifted_matrix 

然後,你可以這樣

diagonalize_matrix(matrix) 

你也可以重新格式化接受角化定義的類型,另一個變量(通過命令行或任何你正在使用它稱之爲如果它應該從左上角,右上角,左下角,右下角增加),但我不確定我完全理解您要求的內容。

+0

謝謝,但我沒有'開始'矩陣 – user2298943 2014-09-23 17:07:07

+0

@ user2298943你的意思是說你沒有'開始'矩陣? 'start'這個詞在我的代碼中沒有任何地方 – asdf 2014-09-23 17:08:29

+0

@ user2298943你的意思是說你需要一些可以接受任何*矩陣的東西並且返回它對角線移動的東西?如果你只是將它重新格式化爲一個函數,我的代碼會這樣做。讓我改變它,看看它是否符合你的目的。 – asdf 2014-09-23 17:10:40

1

的問題是容易得多,如果你把它當作兩個矩陣覆蓋,而不是元組的一個矩陣:

m1 = [ [0,1,2], [3,4,5], [6,7,8]] 
m2 = [ [0,1,2], [0,1,2], [0,1,2]] 

def shift (row, pivot): 
    for idx, item in enumerate(row): 
     if idx <= pivot: 
      yield pivot 
     else: 
      yield item 

def merge (mat1, mat2): 
    result = [] 
    for r1, r2 in zip (mat1, mat2): 
     new_row = [(c1, c2) for c1, c2 in zip (r1, r2)] 
     result.append(new_row) 
    return result 

shifted =[] 
for idx, row in enumerate(m2): 
    shifted[idx] = [i for i in shift(row, idx)] 

print merge (m1, shifted) 
#[[(0, 0), (1, 1), (2, 2)], [(3, 1), (4, 1), (5, 2)], [(6, 2), (7, 2), (8, 2)]] 

這是一個有點棘手,如果你要支持不同的換擋模式,但你可以通過在測試作爲shift功能