2012-08-09 41 views
14

我想在Python scipy模塊轉置方法的一個非常基本的例子,但沒有給予預期的結果。我用python模式使用Ipython。Numpy轉置不給予預期的結果

a = array([1,2,3] 
print a.shape 
>> (3,) 
b = a.transpose() 
print b.shape 
>> (3,) 

如果我打印數組「a」和「b」的內容,它們是相似的。

期望是:(這將導致在Matlab OM轉)

[1, 
    2, 
    3] 
+0

類似:http://stackoverflow.com/questions/5954603/python-numpy-transpose – nobar 2013-02-13 06:36:02

回答

17

NumPy的transpose()有效地反轉了一個數組的形狀。如果數組是一維的,這意味着它沒有效果。

在NumPy的,陣列

array([1, 2, 3]) 

array([1, 
     2, 
     3]) 

實際上是相同的 - 它們只在空白不同。你可能需要的是相應的二維數組,其中transpose()可以正常工作。也可以考慮使用與NumPy的matrix類型:

In [1]: numpy.matrix([1, 2, 3]) 
Out[1]: matrix([[1, 2, 3]]) 

In [2]: numpy.matrix([1, 2, 3]).T 
Out[2]: 
matrix([[1], 
     [2], 
     [3]]) 

注意,對於大多數應用來說,普通的一維數組將正常工作既是一個行或列向量,但是從MATLAB來的時候,你可能更喜歡使用numpy.matrix

+4

'matrix'沒有按」 t的行爲完全像'array'。它造成混亂。切斷電源並從'array'開始可能會更好。 – jfs 2012-08-09 15:04:43

+1

@ J.F.Sebastian:它的行爲不同的事實正是我提到它的原因,因爲這種行爲更接近Matlab用戶習慣的。我很少使用矩陣類,但我發現它有時候很方便。 – 2012-08-09 15:39:28

+0

最近,我不得不使用一個函數(來自'sklearn'),它在其輸入上調用.shape來決定特徵和樣本的數量。所以對於我的數據,它明確需要一個形狀(5,1)的輸入數組而不是(1,5),以便做我想要的。在這種情況下,「矩陣」將起作用,而「陣列」不會 - 除非有辦法用數組來處理這個問題。 – user2428107 2015-10-08 06:29:52

5

你應該嘗試:a = array([[1,2,3]])a = array([[1],[2],[3]]),就是a應該是一個矩陣(行向量,列向量)。

23

Transpose是一維數組的一個noop。

添加新中軸線和轉:

>>> a[None].T 
array([[1], 
     [2], 
     [3]]) 
>>> np.newaxis is None 
True 

或整形:

>>> a.reshape(a.shape+(1,)) 
array([[1], 
     [2], 
     [3]]) 

或者像@Sven Marnach的意見建議,在末尾添加新中軸線:

>>> a[:,None] 
array([[1], 
     [2], 
     [3]]) 
+0

除了在開始和移位時添加一個軸,我通常更喜歡在最後添加新的軸:'a [:,None]'將在一個步驟中給出所需的結果。 – 2012-08-09 14:39:31

+0

@SvenMarnach:我已經更新了答案 – jfs 2012-08-09 14:41:44

+0

爲了推廣更高維度,使用@SvenMarnach的思想,你可以做'a [...,None]'。 http://docs.scipy.org/doc/numpy-1.10.1/user/basics.indexing.html#structural-indexing-tools – astrojuanlu 2015-12-21 06:48:58

5

將一維陣列重塑爲二維陣列的更簡潔的方式是:

a = np.array([1,2,3]), a_2d = a.reshape((1,-1)) or a_2d = a.reshape((-1,1)) 

-1的形狀矢量意味着「填寫任何數字,使這項工作」

相關問題