2013-03-18 85 views
6

a成爲python中的一個列表。在numpy中推廣矩陣轉置

a = [1,2,3] 

當矩陣轉置應用於a,我們得到:

np.matrix(a).transpose() 
matrix([[1], 
     [2], 
     [3]]) 

我期待推廣這項功能,因此接下來說明什麼,我期待用一個例子來幫助做。讓b成爲另一個列表。

b = [[1, 2], [2, 3], [3, 4]] 

a,列表項是1,2和3。我想在b考慮每個[1,2][2,3],並且[3,4]列表項,僅用於執行轉置的目的。我想輸出如下:

array([[[1,2]], 
     [[2,3]], 
     [[3,4]]]) 

一般情況下,我希望能夠指定一個列表項會是什麼樣子,並執行基於一個矩陣轉置。

我可以只寫幾行代碼來完成上述操作,但是我提出這個問題的目的是找出是否有內置的numpy功能或pythonic方式來執行此操作。

編輯:unutbu下面的輸出匹配我上面的輸出。但是,我想要一個解決方案,可以用於更普遍的情況。我在下面發佈了另一個輸入/輸出。我最初的例子不足以表達我想說的話。讓b中的項目爲[1,2],[2,3],[3,4][5,6]。那麼下面給出的輸出將是對高維元素進行矩陣轉置。更一般地說,一旦我描述了一個'項目'的樣子,我想知道是否有辦法做一些轉置。

Input: b = [[[1, 2], [2, 3]], [[3, 4], [5,6]]] 
Output: array([[[1,2], [3,4]], 
       [[2,3], [5,6]]]) 
+0

你可以使用元組而不是列表來表示不可分割的矩陣元素。 – 2013-03-18 17:36:08

+0

NumPy矩陣始終是二維的。你想要的矩陣是三維的。 – unutbu 2013-03-18 17:36:27

+0

您是否改變了問題或將解決方案編輯爲問題? – 2013-03-18 17:48:49

回答

4

你想要的數組有形狀(3,1,2)。 b有形狀(3,2)。要在中間粘貼額外的軸,請使用b[:,None,:]或(等效)b[:, np.newaxis, :]。尋找section on Basic Slicing中的「newaxis」。

In [178]: b = np.array([[1, 2], [2, 3], [3, 4]]) 

In [179]: b 
Out[179]: 
array([[1, 2], 
     [2, 3], 
     [3, 4]]) 

In [202]: b[:,None,:] 
Out[202]: 
array([[[1, 2]], 

     [[2, 3]], 

     [[3, 4]]]) 

另一個的Userful工具是np.swapaxes

In [222]: b = np.array([[[1, 2], [2, 3]], [[3, 4], [5,6]]]) 

In [223]: b.swapaxes(0,1) 
Out[223]: 
array([[[1, 2], 
     [3, 4]], 

     [[2, 3], 
     [5, 6]]]) 

轉置,b.T相同交換的第一和最後的軸,b.swapaxes(0,-1)

In [226]: b.T 
Out[226]: 
array([[[1, 3], 
     [2, 5]], 

     [[2, 4], 
     [3, 6]]]) 

In [227]: b.swapaxes(0,-1) 
Out[227]: 
array([[[1, 3], 
     [2, 5]], 

     [[2, 4], 
     [3, 6]]]) 

總結:

  • 使用np.newaxis(或None)添加新軸。 (因此,增加陣列的尺寸)
  • 使用np.swapaxes交換任意兩個軸。使用np.transpose一次排列所有的軸。 (感謝@jorgeca指出了這一點。)
  • 使用np.rollaxis來「旋轉」軸。
+0

我剛剛在我的帖子中改變了輸出類型以匹配你的。但是,如果您查看您的輸出,它與我的文章中指定的不匹配。你可以想象我的輸出是一個列矩陣,其項目都是列表。 – rsimha 2013-03-18 17:50:50

+0

@rsimha:的確,我誤解了方括號的位置。你想要的數組有形狀(3,1,2)。 'b'具有形狀(3,2)。要在中間粘貼一個額外的尺寸(err,「軸」),使用'b [:,None,:]'。 – unutbu 2013-03-18 17:59:36

+0

謝謝。這匹配我的文章中的輸出。但是,我想要一個解決方案,可以用於更普遍的情況。我發佈了另一個輸入/輸出。我最初的例子不足以表達我想說的話。 – rsimha 2013-03-18 19:06:20