1. 程式人生 > >5-Numpy似雙絲網,中有千千結(下)

5-Numpy似雙絲網,中有千千結(下)

base can sin 描述 現在 sel coj apn ase

“橫看成嶺側成峰,遠近高低各不同。Numpy漸欲迷人眼,淺草剛能沒馬蹄。”古人為了描述Numpy中Array的變幻莫測和難以掌控,曾留下千古名句,為後世傳頌。閱讀理解題:本詩前兩句描述的是Array中的哪種操作?答案:切片。(看完男默女淚……氣氛漸漸凝固 ( ̄▽ ̄")

不扯沒用的了,下面我們來學習一些硬知識。有了上篇做鋪墊,相信下篇學起來一定會如魚得水,酣暢淋漓,欲罷不能!

02

多維數組

上篇提到的例子都是一維數組,其實Numpy可以創建任意維度的數組,所有之前提到的方法也可以應用在多維數組上。例如:一個列表的列表可以用來初始化一個二維數組:

技術分享

通過二維數組我們已經發現了Array的強大(確定不是自嗨?):一個嵌套的List可以通過多次使用[ ]運算符來做索引訪問元素,而多維數組支持一種更加自然的索引方法,即只用一個[ ]及多個用逗號隔開的標號來訪問元素:

技術分享

事實上,數組的形狀可以隨時改變,只要元素的總數不變就行。例如:我們需要一個從0遞增的2x4數組,可以這樣初始化:

技術分享

  • 視圖,而非拷貝

變形(reshape)操作和Numpy中的大部分其他操作類似,只是提供相同內存的不同視圖:

技術分享

這種淺拷貝行為使得向量化運算非常高效。如果需要深拷貝,可按下面操作:

技術分享

  • 切片

對於多維數組,我們也可以使用切片,並可把切片和單個索引值混合使用(分別用在不同維度上),仍以上面的arr2為例:

技術分享

如果只用一個索引值,則會返回低一維的數組,包含索引值所指的那一行:

技術分享

  • 數組的屬性和方法

我們已經學會了如何創建多維數組,現在來了解一下數組的常用屬性和方法。下面這些屬性提供數組的大小、形狀、數據類型等基本信息:

技術分享

數組也有很多有用的方法,下面列出一些特別有用的:

技術分享

上面的方法都是針對數組所有元素來做運算的,而對於多維數組,我們也可通過傳入axis參數,實現只在某一維度上進行計算:

技術分享

從上例可以看出,axis參數值代表運算進行時所消耗的那個維度值。這就是為什麽在行方向上求和時需要設定axis=0。

Array的另一個常用屬性是.T,可以返回該數組(或矩陣)的轉置:

技術分享

  • 數組運算

數組支持所有常規的數學運算,numpy庫中包含一整套可作用於數組上的基本數學函數。需要記住的是,所有面向數組的運算都是按元素進行的(Element-wise),即對數組中的所有元素同時生效。例如:

技術分享

另外還需記住,數組的乘法運算也是按元素進行的,而不像線性代數中的矩陣乘法運算那樣。

技術分享

也可以乘以一個標量:

技術分享

下面是一個“廣播”的例子:

技術分享

視覺化理解“廣播”

技術分享

這種為遷就對方而變形的行為實在太默契了,竟然讓群主眼眶濕潤 (☆▽☆)y

  • Element-wise函數

前面我們提到,numpy提供一整套作用於array上的數學函數,包括對數、指數、三角函數等。例如,在正弦函數上[0,2*pi]區間內均勻取100個樣本點,可以用下面方法輕松實現:

技術分享

  • Numpy中的線性代數運算

Numpy提供一套基本的線性代數函數庫,如所有數組都可以應用dot方法,當參數為兩個向量(一維數組)時,進行的是向量的標量積運算;當參數中至少有一個為二維數組時,進行的是傳統的矩陣乘法運算。

技術分享

下面是一個常見的矩陣向量乘法例子,註意數組v1應被看作一個列向量。Numpy並不區分行向量和列向量,只是簡單地校驗維度是否符合矩陣乘法運算規則。在下例中,我們用一個2x3的矩陣和一個3維向量相乘,得到一個2維向量:

技術分享

對於矩陣乘法,相同的維度匹配規則也要被滿足。考慮A×A.T和A.T×A的區別:

技術分享

這節課的學習筆記好長,差點把群主整殘了(ㄒoㄒ)/

Anyway,結果是最重要的,終於陪大家鉆過了第一個火圈,倍感欣慰:)

下一周講Pandas入門。人生若只如初見,何事秋風悲畫扇,讓我們休整一下疲憊的心,以對待初戀的心態迎接下一個、下下一個關卡吧!

5-Numpy似雙絲網,中有千千結(下)