【Python】無須numpy,利用map函數與zip(*)函數對數組轉置(轉)


http://blog.csdn.net/yongh701/article/details/50283689

在Python的numpy中,對類似array=[[1,2,3],[4,5,6],[7,8,9]];的二維數組的轉置,就一句話array.T。其實不使用numpy,單純使用Python,代碼也不長,同樣也是一行。不過在此之前,先說明Python中map函數與zip(*)的使用。

一、map函數

首先Python中的map函數是很簡單的。意為將第二個參數(一般是數組)中的每一個項,處理為第一個參數的類型。比如如下的代碼,將a這個list的每一項都從int類型轉化為str類型。

 

[python] view plain copy
 
print?
  1. #-*-coding:utf-8-*-  
  2. a=[1,2,3];  
  3. print map(str,a);  
#-*-coding:utf-8-*-
a=[1,2,3];
print map(str,a);


運行結果如下:

 

而如下的數組,則對a這個二維數組中的每一個項的一維數組進行求和操作,最后得出來自然是一個一維數組,因為每一個項的一維數組,轉化為一個int。

 

[python] view plain copy
 
print?
  1. #-*-coding:utf-8-*-  
  2. a=[[1,3,4],[2,3,2]];  
  3. print map(sum,a);  
#-*-coding:utf-8-*-
a=[[1,3,4],[2,3,2]];
print map(sum,a);


運行結果如下:

 

二、zip(*)

在《【Python】用zip函數求歐氏距離、余弦相似度》(點擊打開鏈接)中已經介紹了zip的使用,

 

比如下述的一段代碼:

 

[python] view plain copy
 
print?
  1. #-*-coding:utf-8-*-  
  2. x=[1,2,3];  
  3. y=[4,5,6];  
  4. z=[7,8,9];  
  5. print zip(x,y,z);  
#-*-coding:utf-8-*-
x=[1,2,3];
y=[4,5,6];
z=[7,8,9];
print zip(x,y,z);


運行結果如下:

 

意思是取各個list的第x項,作為返回的二維數組的第x項中的一維數組中的元素。

其實zip還是反過來會這個二維數組操作,但要注意寫成zip(*),表示這是一個zip的逆操作。

比如下述的一段代碼:

 

[python] view plain copy
 
print?
  1. # -*-coding:utf-8-*-  
  2. array=[[1,4,7],[2,5,8],[3,6,9]];  
  3. x,y,z=zip(*array);  
  4. print x,y,z;  
# -*-coding:utf-8-*-
array=[[1,4,7],[2,5,8],[3,6,9]];
x,y,z=zip(*array);
print x,y,z;


xyz的值分別如下所示,恰好與zip函數形成一個逆操作。

 

三、python中二維數組的轉置

這與數組轉置有什么相關呢?

注意到,如果zip(*array)不經過x,y,z=zip(*array);拆分成x,y,z三個變量,那么[[1,4,7],[2,5,8],[3,6,9]];被zip(*array)之后的結果恰好是[(1, 2, 3), (4, 5, 6), (7, 8, 9)],剛好形成一個轉置的關系。這對於所有array=[[1,2,3],[4,5,6],[7,8,9]];的二維數組都是一樣的,不信可以試試。

當然[(1, 2, 3), (4, 5, 6), (7, 8, 9)]還不是我們需要的最后的結果,

因為只是一個存放tuple的list,我們要保持原來list是存list的一致性,所以要應用到上方的map函數。

因此對於一個數組的轉置,代碼如下:

 

[python] view plain copy
 
print?
  1. # -*-coding:utf-8-*-  
  2. array = [[1, 4], [2, 5], [3, 6]];  
  3. print map(list, zip(*array));  
# -*-coding:utf-8-*-
array = [[1, 4], [2, 5], [3, 6]];
print map(list, zip(*array));


運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM