1. 程式人生 > >numpy 維度、軸和transpose的理解

numpy 維度、軸和transpose的理解

前言

  最近在看pandas的創始人寫的一本資料分析,在其中使用numpy建立多維陣列的時候提到了很多有關陣列的維度和軸的一些相關的知識,而剛開始閱讀的時候由於對這部分有些理解不到位,導致後面理解陣列轉換的時候出現了很多坑爹問題。所以特此寫幾個簡單的例項分析一下。小夥伴們也可以一起瞅瞅,看看能不能加深一下印象。
  

維度

  在數學上我們說維度是什麼呢?–在一定的前提下描述一個數學物件所需的引數個數。但是我們今天所談到的維度卻和這裡數學所說的維度有著一些區別。有標題可知,我們今天所要說的維度是基於numpy中的多維陣列。numpy最重要的一個特點就是其N維陣列物件,該物件是一個大的靈活的大資料集容器。以此利用陣列來對我們獲取到的整塊的資料執行一些數學上的運算。繞了一圈,維度又是啥,我們先來看一下以下的程式碼。
  

> data = np.array([[1,2],[4,5]])
> data.shape()
(2L, 2L)
> data1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
> data1.shape
(3L, 3L)

  對人來說高維空間是很難想象的,但是我們可以從純數學的角度來看。對多維陣列來說,確定最底層的一個基本元素位置需要用到的索引個數即是維度。用上面的陣列data來舉一個簡單的例子。當我們要獲取 1 的值,我們需要使用 a[0][0], 一共用到了兩個座標索引,所以這個陣列的維度是2維。
  直觀的說陣列的維度就是所有基本元素左邊 [ 個數的最大值。而每個座標索引可取的值是有範圍的,比如這裡兩個索引都只能取 0 和 1。維度與座標值範圍就組成了多維陣列的 shape 屬性,它是一個元組,長度代表了維度,而元組的每一個值代表了一個座標索引可取的值個數,所以將 shape 的所有值乘起來就可以算出多維陣列元素的個數。就如舉例中的兩個例子一個是2*2的陣列,而另一個是一個3*3的陣列。
  

  軸這個概念可以說是我第一次看到這個概念,在學習線性代數的時候,貌似也沒有聽過(大霧)。理解numpy中的軸的概念對我們接下來理解numpy中的轉置transpose有著至關重要的作用。
  如果我們直接說軸這個概念,童鞋們可能會比較迷茫,我們先來說一個和它非常相似的概念—座標軸。n 維空間裡有 n 個座標軸,並且座標軸互相垂直,每一個點相對於一條座標軸都有唯一的一個座標值。對同一條座標軸來說,座標值相同的點在同一個 n-1 維的“平面”上。任意取一個“平面”,我們就能定義“同一個座標軸上的點”,這些點在“平面”上的投影相同,同一個座標軸上的點組成的線是與座標軸平行的。而所謂的延軸計算實際上是降維的過程,同一個座標軸上的點合併成一個點,這樣n維空間就變成了 n-1 維空間。如果童鞋們還不理解,這裡引用一個別的博文中常提到的另外一個解釋。來看下例子

>> data2
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>> data2.shape
(2L, 3L, 4L)

  這裡會常常提到這樣的一個例子,這個陣列我們該如何稱呼它呢?2行3列4個平面。這其實就和我們上面所描述的座標軸的概念十分的接近。如果你喜歡這樣的說法也是可以的。
  看完了座標軸,下面我們來說說軸,如果還是有些問題的童鞋可以參考一下下面的理解。要理解它,我們可以先使用一下它,並且觀察一下它是如何進行操作的。我們用最簡單的累加來進行一下操作。程式碼如下
  

data2.sum(axis=0)
Out[49]: 
array([[12, 14, 16, 18],
       [20, 22, 24, 26],
       [28, 30, 32, 34]])

data2
Out[50]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

data2.sum(axis=1)
Out[51]: 
array([[12, 15, 18, 21],
       [48, 51, 54, 57]])

data2.sum(axis=2)
Out[52]: 
array([[ 6, 22, 38],
       [54, 70, 86]])

  如果你還是懵逼的,那麼我們來參考一下下面的圖。
  這裡寫圖片描述
  紅線框代表的是以軸為0相加的情況,而黃線則是軸為1,藍線自不必多說就是軸為2的情況。
  具體到 numpy 中的多維陣列來說,軸即是元素座標的索引。比如,第0軸即是第1個索引,延0軸計算就是去掉座標中的第一個索引。過程就是
1.遍歷其他索引的所有可能組合
2. 取出一個組合,保持值不變,遍歷第一個索引所有可能值
3.根據索引可以獲得了同一個軸上的所有元素
4.對他們進行計算得到最後的元素
5.所有組合的最後結果組到一起就是最後的 n-1 維陣列
所以如果一個多維陣列的 shape 是 (a1, a2, a3, a4), 那麼延軸0計算最後的陣列shape 是 (a2, a3, a4), 延軸1計算最後的陣列shape是 (a1, a3, a4)。

Transpose

  最後我們來說一下numpy的transpose這個引數。這個引數是我們在基於理解了軸,維度等情況下對多維陣列進行的一個重要的操作,不過這個理解起來倒確實有些令人頭疼。
  首先我們對矩陣的維度進行編號,上述矩陣有三個維度,則編號分別為0,1,2,而transpose函式的引數輸入就是基於這個編號的,如果我們呼叫transpose(0,1,2),那麼矩陣將不發生變化,如果我們不輸入引數,直接呼叫transpose(),其效果就是將矩陣進行轉置,起作用等價與transpose(2,1,0)。
  

data2.transpose(0,1,2)#(2,3,4)
Out[60]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

data2.transpose(1,0,2)#(3,2,4)
Out[61]: 
array([[[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 4,  5,  6,  7],
        [16, 17, 18, 19]],

       [[ 8,  9, 10, 11],
        [20, 21, 22, 23]]])

data2.transpose(0,2,1)#(2,4,3)
Out[62]: 
array([[[ 0,  4,  8],
        [ 1,  5,  9],
        [ 2,  6, 10],
        [ 3,  7, 11]],

       [[12, 16, 20],
        [13, 17, 21],
        [14, 18, 22],
        [15, 19, 23]]])

data2.transpose()#(4,3,2)
Out[63]: 
array([[[ 0, 12],
        [ 4, 16],
        [ 8, 20]],

       [[ 1, 13],
        [ 5, 17],
        [ 9, 21]],

       [[ 2, 14],
        [ 6, 18],
        [10, 22]],

       [[ 3, 15],
        [ 7, 19],
        [11, 23]]])

  在沒次變換的後面我都註明了變換的維度,大家可以參照著看一下,如果實在不懂,我建議大家多畫圖,這樣就比較方便理解。

總結

  維度和軸作為理解多維陣列的重要概念需要我們稍微深入地去了解,同時也算是為後面使用pandas做一個小的鋪墊。
  各位大佬如果文中有什麼問題希望多多留言 謝謝。

相關推薦

numpy 維度transpose理解

前言   最近在看pandas的創始人寫的一本資料分析,在其中使用numpy建立多維陣列的時候提到了很多有關陣列的維度和軸的一些相關的知識,而剛開始閱讀的時候由於對這部分有些理解不到位,導致後面理解陣列轉換的時候出現了很多坑爹問題。所以特此寫幾個簡單的例項分析

numpy下的交換transpose swapaxes的解讀

  法的引數是一個 由 軸編號(軸編號自0 開始) 序列構成的 元組。 開始時,陣列的軸編號序列是預設從 0開始的 :0,1,2,, 座標的順序也是這個軸編號的順序,(0,1,2) 當使用 transpose 時候,軸編號的順序變成了 (1,0,2) 說明 0號軸和1號軸的順序變

numpy 維度的問題

0. 多維陣列的顯示問題 >> X = np.reshape(np.arange(24), (2, 3, 4)) # 也即 2 行 3 列的 4 個平面(plane) &g

numpy之轉置(transpose對換

轉置(transpose)和軸對換 轉置可以對陣列進行重置,返回的是源資料的檢視(不會進行任何複製操作)。 轉置有三種方式,transpose方法、T屬性以及swapaxes方法。 1 .T,適用於一、二維陣列 In [1]: import numpy as

R數據可視化----ggplot2之標度坐標圖例詳解

abs 調整 所有 不同的 size n) 默認 表達 idt 標度控制著數據到圖形屬性的映射,當有需要時,ggplot2會自動添加一個默認的標度。我們確實可以在不了解標度運行原理的情況下畫出許多圖形,但理解標度並學會如何操縱它們則將賦予我們對圖形更強的控制能力。 每一種圖

JavaC++PythonRubyPHPC#JavaScript的理解

皮膚 叔叔 保持 大學 學校 cti java 等等 無需 Java、C++、Python、Ruby、PHP、C#和JavaScript和日本動漫裏的那些大家熟悉的動漫人物結合起來。依據他們的身世、個人經歷來生動的表達各編程語言的發展歷程。原文內容例

關於組態王梯形圖Unity梯形圖 的知識理解

png 設置 ges 第一個 理解 images img 軟件 一個 1.必須在博圖軟件Step7中運行,組態王和unity才能和PLC進行通信 必須在博圖軟件Step7中運行,組態王和unity才能和PLC進行通信 2.組態王和unity不能讀寫PLC的數

一張圖理解prototypeprotoconstructor的三角關系

== fun func 作用 foo 功能 關於 const mage 前面的話   javascript裏的關系又多又亂。作用域鏈是一種單向的鏈式關系,還算簡單清晰;this機制的調用關系,稍微有些復雜;而關於原型,則是prototype、proto和constructo

JVM視角淺理解並發

之前 鎖定 線程 並發 標示 靜態變量 原子操作 store 執行順序   根據《深入理解java虛擬機》這本書總結   提到java的並發和鎖,第一反應可能回想到多線程、synchronized關鍵字等,那麽對於jvm虛擬機,這些是如何實現的呢?或者用的什麽思想實現的?

iptables中DNATSNATMASQUERADE的理解

href load pos get eth0 mage 讀取 轉發 wid DNAT(Destination Network Address Translation,目的地址轉換) 通常被叫做目的映謝。而SNAT(Source Network Address Transla

前端模塊化的一些理解-commonJsAMDCMD

() urn fig comm tor 實現 ports ont 相對 ---恢復內容開始--- 前端模塊化規範有三種:CommonJs\AMD\CMD CommonJs 用於服務器端 AMD 用於瀏覽器環境,是RequireJS在推廣過程中對模塊定義的規範化產出

理解jquery的$.extend()$.fn$.fn.extend()

ffi 通過 obj index author com div bar comm 理解jquery的$.extend()、$.fn和$.fn.extend() 前端博客?前端開發代碼?jQuery?115310View1 文章目錄 jQuery.fn jQue

數據庫的DDLDMLDCL的區別與理解

化工 drop delete 狀態 才有 dcl com eve man DML(data manipulation language): 它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對數據庫裏的數據進行操作的語言

深入理解Lua的閉包一:概念應用實現原理

觀點 數組 line Language 場景 test 詞法 nil 實參 本文首先通過具體的例子講解了Lua中閉包的概念,然後總結了閉包的應用場合,最後探討了Lua中閉包的實現原理。 閉包的概念 在Lua中,閉包(closure)是由一個函數和該函數會訪問到的

Numpy的ReshapeTranspose

      今天餘凱同學用python在從mat檔案裡面讀取圖片資訊時,遇到一個問題,matlab儲存圖片的時候預設的是(長 * 寬 * 圖片個數),他用python讀出來numpy格式就是(長 * 寬 * 圖片個數),所以讓我幫忙轉換成(圖片個數 * 長 * 寬),好

kconfigmenuconfig .config 的理解

1、kconfig:是核心的配置選單 2、menuconfig:是一個圖形化的介面,方便核心的裁剪 3、.config:編譯核心所依據的配置 Linux編譯器通過.config檔案確認哪些程式碼編譯進核心,哪些被裁減掉, menuconfig是生成.config的一個工具。

對SwooleWorkermanphp自帶的socket的理解

開源項目 局限性 ole 來源 worker 建議 般的 detail 管理 為什麽php自帶的socket不怎麽聽說,基本都是用swoole,workerman去實現? 1、PHP的socket擴展是一套socket api,僅此而已。 swoole,用C實現,它的s

npmpackage.json的理解學習

npm 是一個包管理器,它讓 JavaScript 開發者分享、複用程式碼更方便(有點 maven 的感覺哈)。 在程式開發中我們常常需要依賴別人提供的框架,寫 JS 也不例外。這些可以重複的框架程式碼被稱作包(package)或者模組(module),一個包可以是一個資料夾裡放著幾個檔案,同時

MySQL基礎系列之 DDLDMLDCL的區別與理解

此文章主要介紹SQL資料庫的DDL、DML和DCL的區別與理解 一、DDL(data definition language) 資料定義語言,用於操作物件和物件的屬性 DDL用於操作物件和物件的屬性,這種物件包括資料庫本身,以及資料庫物件,像:表、檢視等等,DDL對這些物件和屬性的管理和

TensorFlow 資料驗證:能夠大規模理解驗證監控資料

文 / Clemens Mewald (產品經理) and Neoklis Polyzotis (研究科學家) 來源 | TensorFlow 公眾號 我們推出了 TensorFlow 資料驗證(TFDV),這是一個可以幫助您大規模地理解、驗證和監控 ML