2017-05-09 38 views
3

我在爲特定數量的行和列創建矩陣時遇到了困難,這些矩陣包含的索引分別是第一行或第一列。如何優雅地創建行列索引作爲第一行/列的矩陣?

# At first I create list of lists with 0 at every position 

string1 = "dog" 
string2 = "hippo" 

Dist = [[0 for column in range(len(string1)+1)] for row in range(len(string2)+1)] 

我想簡化這一步如果可能的話:

Dist[0] = [x for x in range(len(string1)+1)] 

for x in range(len(string2)+1): 
     Dist[x][0] = x 

這裏是期望和當前結果的樣子(這是列表的列表):

print(Dist) 
    [[0, 1, 2, 3], 
    [1, 0, 0, 0], 
    [2, 0, 0, 0], 
    [3, 0, 0, 0], 
    [4, 0, 0, 0], 
    [5, 0, 0, 0]] 

我計劃在距離計算問題中使用這個矩陣,但這是一個獨立的部分,我不需要解決。

我的主要問題是,如果我做對了(我想不是),如何做得更好。任何,即使一般意見,將不勝感激。

+0

你確定你不就是想形狀的三個獨立的(排列)陣列,'(1,5)','(3,1 )'和'(3,5)'?爲什麼把它們疊在一起 – Eric

回答

4

既然你已經標記numpy,這裏是numpy一個選項:

n_cols, n_rows = len(string1)+1, len(string2)+1 
Dist = np.zeros((n_rows, n_cols), dtype=np.int32) 

Dist[0,:] = np.arange(n_cols) 
Dist[:,0] = np.arange(n_rows) 
Dist 
#array([[0, 1, 2, 3], 
#  [1, 0, 0, 0], 
#  [2, 0, 0, 0], 
#  [3, 0, 0, 0], 
#  [4, 0, 0, 0], 
#  [5, 0, 0, 0]], dtype=int32) 
+1

謝謝,這就是我一直在尋找的東西。我接受這個答案,因爲它比MSeiferts更高,儘管你們在同一分鐘都回答。 – StefanK

4

什麼只是分配np.arange s到一個np.zero陣列:

>>> import numpy as np 

>>> x = 6 
>>> y = 4 
>>> arr = np.zeros((x, y), dtype=int) 
>>> arr[0, :] = np.arange(y) 
>>> arr[:, 0] = np.arange(x) 
>>> arr 
array([[0, 1, 2, 3], 
     [1, 0, 0, 0], 
     [2, 0, 0, 0], 
     [3, 0, 0, 0], 
     [4, 0, 0, 0], 
     [5, 0, 0, 0]]) 
3

因爲我們的目標優美,這裏有一個緊湊版本np.ogrid,它爲我們設置了範圍數組,然後我們可以將第一行和第二列分配給一步 -

L1,L2 = len(string1)+1, len(string2)+1 
Dist1 = np.zeros((L2,L1),dtype=int) 
Dist1[:,[0]], Dist1[0] = np.ogrid[:L2,:L1] 

樣本輸出 -

In [76]: Dist1 
Out[76]: 
array([[0, 1, 2, 3], 
     [1, 0, 0, 0], 
     [2, 0, 0, 0], 
     [3, 0, 0, 0], 
     [4, 0, 0, 0], 
     [5, 0, 0, 0]]) 
相關問題