2017-10-05 70 views
0

我已經看到很多列表到數組中的例子,但是沒有這種格式列表到數組中的例子,這很奇怪,因爲我提出的列表格式是定義圖的標準定向方式,您可以在任何表格,csv,數據庫等中找到的點對點映射。我嘗試了一切here,但沒有運氣。感謝您的任何想法。Python列表到數組中

Input and desired output

input= [[A, A, 0], 
     [A, B, 5], 
     [A, C, 3], 
     [B, A, 5], 
     [B, B, 0], 
     [B, C, 6], 
     [C, A, 3], 
     [C, B, 6], 
     [C, C, 0]] 

desiredOutput= [[0, 5, 3], 
       [5, 0, 6], 
       [3, 6, 0]] 
+0

輸入= [[A,A,0] , [A,B,5], [A,C,3], [B,A,5], [B,B,0], [B,C,6], [C,A,3], [C,B,6], [C,C,0]] desiredOutput = [ [0,5,3], [5,0,6], [3,6,0]] – user3431083

+0

我覺得像'pandas'這樣的模塊通常是您可以處理這些數據的方式。 –

回答

2

這裏生產的鄰接矩陣作爲2D numpy的陣列的一種方式。它假設輸入圖形數據是正確的,特別是它的長度是一個完美的正方形。

import numpy as np 

graph_data = [ 
    ['A', 'A', 0], ['A', 'B', 5], ['A', 'C', 3], 
    ['B', 'A', 5], ['B', 'B', 0], ['B', 'C', 6], 
    ['C', 'A', 3], ['C', 'B', 6], ['C', 'C', 0], 
] 

size = np.sqrt(len(graph_data)).astype(np.int) 
adjacency_matrix = np.array(graph_data)[:,-1].astype(np.int).reshape(size, size) 
print(adjacency_matrix) 

輸出

[[0 5 3] 
[5 0 6] 
[3 6 0]] 

上面的代碼還假定圖數據是正確的順序,因爲它忽略的字母。當然,通過在嘗試將圖數據轉換爲數組之前排序圖數據很容易。例如,

graph_data.sort() 

這裏的一個純Python版本輸出元組的列表:

graph_data = [ 
    ['A', 'A', 0], ['A', 'B', 5], ['A', 'C', 3], 
    ['B', 'A', 5], ['B', 'B', 0], ['B', 'C', 6], 
    ['C', 'A', 3], ['C', 'B', 6], ['C', 'C', 0], 
] 

graph_data.sort() 
size = int(len(graph_data) ** 0.5) 
it = iter(row[-1] for row in graph_data) 
print(list(zip(*[it]*size))) 

輸出

[(0, 5, 3), (5, 0, 6), (3, 6, 0)] 
+0

選擇此解決方案是因爲它比其他指數更快。特別是,輸出元組列表的解決方案,然後可以將其轉換爲numpy數組。 以180萬個節點爲例測試了性能 - 其他建議耗時10秒,但這個解決方案令人驚訝的是0.3秒 – user3431083

2

您可以直接切片陣列,並且重塑它:

input= [['A', 'A', 0], ['A', 'B', 5], ['A', 'C', 3], ['B', 'A', 5], ['B', 'B', 0], ['B', 'C', 6], ['C', 'A', 3], ['C', 'B', 6], ['C', 'C', 0]] 
arr = np.array(input) 
desiredOutput=arr[:, 2].reshape(3, 3).astype(np.float) 
# array([[ 0., 5., 3.], 
#  [ 5., 0., 6.], 
#  [ 3., 6., 0.]]) 
+2

只要輸入中的條目總是按正確的順序排列,即前兩列實際上並不重要(但如果不是這種情況,則可以對輸入進行排序) –

+0

訂單總是按字母順序排列:訂單由col 1,然後col 2. – user3431083

+0

@tobias_k你是對的......它可能並非如此。 –