1. 程式人生 > >【Python】無須numpy,利用map函數與zip(*)函數對數組轉置(轉)

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

http details 介紹 二維數組 nbsp 圖片 因此 art comm

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));


運行結果如下:

技術分享圖片

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