NumPy入門系列(一)

NumPy入門系列(一)

何為Numpy?

NumPy(NumericalPython的簡稱)是Python數值計算最重要的基礎包。NumPy的功能如下:

  • ndarray,一個具有矢量算術運算和複雜廣播能力的快速且節省空間的多維數 組。
  • 用於對整組數據進行快速運算的標準數學函數(無需編寫循環)。
  • 用於讀寫磁盤數據的工具以及用於操作內存映射文件的工具。
  • 線性代數、隨機數生成以及傅里葉變換功能。
  • 用於集成由C、C++、Fortran等語言編寫的代碼的ACAPI。

為什麼用NumPy?

高效性,直觀感受一下吧!


NumPy入門系列(一)

基於NumPy的算法要比純Python快10到100倍(甚至更快),並且使用的內存更 少。

numpy最基礎的東西---ndarray

NumPy最重要的一個特點就是其N維數組對象(即ndarray),該對象是一個快速而 靈活的大數據集容器。你可以利用這種數組對整塊數據執行一些數學運算,其語法跟標量元素之間的運算一樣。

創建ndarray:


NumPy入門系列(一)


NumPy入門系列(一)


NumPy入門系列(一)

總結如下:

NumPy入門系列(一)

ndarray的數據類型:dtype

dtype(數據類型)是一個特殊的對象,它含有ndarray將一塊內存解釋為特定數據類型所需的信息:


NumPy入門系列(一)

你也可以通過ndarray的astype方法明確地將一個數組從一個dtype轉換成另一個 dtype:

NumPy入門系列(一)

NumPy入門系列(一)

NumPy數組的運算---矢量化

不用編寫循環即可對數據執行批量運算大小相等的數組之間的任何算術運算都會將運算應用到元素級:

NumPy入門系列(一)

NumPy入門系列(一)

不同大小的數組之間的運算叫做廣播(broadcasting),將會在以後介紹。

基本的索引和切片

一維數組的切片和列表類似:

NumPy入門系列(一)

跟列表最重要的區別在於,數組切片是原始數組的視圖。這意味著數據不會被複制,視圖上的任何修改都會直接反映到源數組上,如果要生成副本,你需要顯式調用copy()。

NumPy入門系列(一)

多維數組切片索引:

在一個二維數組中,各索引位置上的元素不再是標量而是一維數組,可以對各個元素進行遞歸訪問,但這樣需要做的事情有點多。你可以傳入一 個以逗號隔開的索引列表來選取單個元素:

NumPy入門系列(一)

下圖說明了二維數組的索引方式:軸0作為行,軸1作為列

NumPy入門系列(一)

高維數組的索引方法類似:


NumPy入門系列(一)

同樣,在上面所有這些選取數組子集的例子中,返回的數組都是視圖。

切片索引

NumPy入門系列(一)

NumPy入門系列(一)

總結:切片規則

NumPy入門系列(一)

自然,對切片表達式的賦值操作也會被擴散到整個選區:

NumPy入門系列(一)

布爾索引

NumPy入門系列(一)

NumPy入門系列(一)

高級索引

NumPy可以利用整數數組進行索引。為了以特定順序選取行子集,只需傳入一個用於指定順序的整數列表或ndarray即可:

NumPy入門系列(一)

採用傳遞數組的索引跟切片不一樣,它總是將數據複製到新數組中,即生成一個副本。

數組轉置和軸對換

轉置是重塑的一種特殊形式,它返回的是源數據的映像(不會進行任何複製操 作)。數組不僅有transpose方法,還有一個特殊的T屬性:

NumPy入門系列(一)

NumPy入門系列(一)

高維數組的燒腦轉置:回到二維數組的轉置

對於高維數組,transpose需要得到一個由軸編號組成的元組才能對這些軸進行轉置,實際上,對二維數組的轉置的等價形式transpose((1,0)):

NumPy入門系列(一)

這裡(1,0)可以理解為軸序,原序為(0,1),即讓原來的1軸上的數據作為現在的0軸上的數據。當然,你不理解也沒關係,接下來只要你知道二維數組是怎麼轉置的即可。任何高維數組的轉置最終都可以變為二維數組的轉置,前提是怎麼變為二維數組(或者說怎麼理解成二維數組),看一個簡單的例子:

NumPy入門系列(一)

(1,0,2)代表軸0和軸1交換,2軸並未受到影響,那麼不妨將[1,2,3]看成一個單獨的數據,記為a,

同樣,b=[ 4, 5, 6],c=[ 7, 8, 9],d=[10, 11, 12],那麼arr=[[a,b],[c,d]],這就是一個二維數組,轉置:

arr=[[a,c],[b,d]],再代換回來,就是上面的結果。再看一例,0軸不變,交換1和2 軸:

NumPy入門系列(一)

發現什麼了沒?你可以將arr看作arr=[a,b],a=[[ 1, 2, 3], [ 4, 5, 6]],b=[[ 7, 8, 9], [10, 11, 12]],這裡a,b就是二維數組,因此arr.transpose((0,2,1))等價於[a.T,b.T],我們不妨稱之為抽取二維數組法。更深入一點,看下例:

NumPy入門系列(一)

有沒有點思路,實際上可以看成(0,1,2)先0軸和1軸交換(1,0,2),得到的新數組1軸和2軸交換(1,2,0),結果一樣:

NumPy入門系列(一)

再深入一點:arr.transpose((2,1,0)),記住不能跨維交換,0和2 不能直接交換,因為我們要轉化為二維的,只能相鄰軸交換,0與1,1與2。

(2,1,0)

--------0和1交換(1,0,2)對應transpose((1,0,2))

-------1和2 交換(2,0,1)對應transpose((2,1,0))

-------0和1交換(2,1,0)對應transpose((0,2,1)):

NumPy入門系列(一)

結果一致!而上述三步分解操作都可以按前面所說理解成二維數組的轉置操作,也就是進行了三次轉置。

本文基本涵蓋了NumPy多維數組生成與索引操作的所有基本知識,一下肯定消化不完,如果覺得有用,記得收藏加關注喲~歡迎下方評論區交流探討。


分享到:


相關文章: