【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
- #-*-coding:utf-8-*-
- a=[1,2,3];
- print map(str,a);
#-*-coding:utf-8-*- a=[1,2,3]; print map(str,a);
運行結果如下:
而如下的數組,則對a這個二維數組中的每一個項的一維數組進行求和操作,最後得出來自然是一個一維數組,因為每一個項的一維數組,轉化為一個int。
[python] view plain copy print?
- #-*-coding:utf-8-*-
- a=[[1,3,4],[2,3,2]];
- 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?
- #-*-coding:utf-8-*-
- x=[1,2,3];
- y=[4,5,6];
- z=[7,8,9];
- 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?
- # -*-coding:utf-8-*-
- array=[[1,4,7],[2,5,8],[3,6,9]];
- x,y,z=zip(*array);
- 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?
- # -*-coding:utf-8-*-
- array = [[1, 4], [2, 5], [3, 6]];
- print map(list, zip(*array));
# -*-coding:utf-8-*- array = [[1, 4], [2, 5], [3, 6]]; print map(list, zip(*array));
運行結果如下:
【Python】無須numpy,利用map函數與zip(*)函數對數組轉置(轉)