2013-03-04 41 views
3

我希望構造像一個矩陣:理解矩陣列出清單,然後numpy的陣列

Col1 Col2 Col3 Coln 
row1 1 2 4 2  
row2 3 8 3 3 
row3 8 7 7 3 
rown n n n n 

我還沒有找到,指出如何名單列表組裝Python文檔中任何東西,是它像:

a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]] 

其中每排列表項或它應該是,每列是一個列表項:

b = [[1,3,8,n],[2,8,7,n],[4,3,7,n],[2,3,3,n]] 

我認爲這將是一個常見問題,但我似乎無法找到直接答案。基於我猜,我可以簡單地將此轉換爲numpy的陣列的文件上

np.array(a) 

誰能幫助?

+0

您可以使用'print(a)'來測試您是否正確執行了格式化操作,以便您可以確定行和列是什麼。 – askewchan 2013-03-04 17:58:37

回答

4

你想的第一個版本:

a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]] 

訪問矩陣中的元素時,通常使用matrix[row][col],所以使用上面的Python列表格式a[i]會給你行ia[i][j]會給你第i行的第j個元素。

要將其轉換爲numpy數組,np.array(a)是正確的方法。

+0

非常感謝你,你和@drewk都提供了我所需要的東西。我很欣賞直言不諱,我發現很多python相關的「特性」可以真正使用更多的前向解釋。再次感謝! – secumind 2013-03-04 18:04:19

1

這個: a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]] 會創建你想要的列表,是的,np.array(a)會將它轉換爲numpy數組。

而且,這是「pythonish」被創建具有m行和n列的陣列(和設置的所有元素爲0)的:

a = [[0 for i in range(n)] for j in range(m)]

1

使用第一個約定。如果轉置需要:

>>> a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],['n','n','n','n']] 
>>> trans=[] 
>>> for i in range(len(a)): 
... trans.append([row[i] for row in a]) 
... 
>>> trans 
[[1, 3, 8, 'n'], [2, 8, 7, 'n'], [4, 3, 7, 'n'], [2, 3, 3, 'n']] 

元素是那麼a[row][col] VS trans[col][row](相對於你的例子a

首先是使用Python和,很容易看出爲什麼你應該使用在第一次大會佈局:

a = [[1,2,4,2], 
    [3,8,3,3], 
    [8,7,7,3], 
    ['n','n','n','n']] 

當然,當您使用numpy的,使用的第一個慣例,因爲所使用的numpy的:

>>> np.array(a) 
array([['1', '2', '4', '2'], 
     ['3', '8', '3', '3'], 
     ['8', '7', '7', '3'], 
     ['n', 'n', 'n', 'n']], 
     dtype='|S1') 
>>> np.array(trans) 
array([['1', '3', '8', 'n'], 
     ['2', '8', '7', 'n'], 
     ['4', '3', '7', 'n'], 
     ['2', '3', '3', 'n']], 
     dtype='|S1') 

注意:由於'n'在最後一行/列中,numpy會將整數轉換爲字符串。

當您實際開始打印該表,這裏是一個辦法:

def pprint_table(table): 
    def format_field(field, fmt='{:,.0f}'): 
     if type(field) is str: return field 
     if type(field) is tuple: return field[1].format(field[0]) 
     return fmt.format(field)  

    def get_max_col_w(table, index): 
     return max([len(format_field(row[index])) for row in table])   

    col_paddings=[get_max_col_w(table, i) for i in range(len(table[0]))] 
    for i,row in enumerate(table): 
     # left col 
     row_tab=[row[0].ljust(col_paddings[0])] 
     # rest of the cols 
     row_tab+=[format_field(row[j]).rjust(col_paddings[j]) for j in range(1,len(row))] 
     print(' '.join(row_tab))     

pprint_table([ 
     ['','Col 1', 'Col 2', 'Col 3', 'Col 4'], 
     ['row 1', '1','2','4','2'], 
     ['row 2','3','8','3','3'], 
     ['row 3','8','7','7','3'], 
     ['row 4', 'n','n','n','n']]) 

打印:

 Col 1 Col 2 Col 3 Col 4 
row 1  1  2  4  2 
row 2  3  8  3  3 
row 3  8  7  7  3 
row 4  n  n  n  n 
1

既然你提到「矩陣」讓我也補充一點,你有NP。 matrix()選項。

例如:可以使用

A = [[1,2,3],[4,5,6],[7,8,9]] 

創建(列表)列表,代表一行中的每個內部列表。

然後

AA = np.array(A) 

將創建與基質的外觀的2D陣列,但不是一個矩陣的所有屬性。

AM = np.matrix(A) 

將創建一個矩陣。

如果你對這兩個算子進行算術運算,你會看到差異。例如,

AA**2 

將在二維數組中排列每個元素。但是,

AM**2 

將自行執行AM的矩陣乘法。

順便說一句。當然,上面的用法假定「導入np爲np」。