NumPy 102:基礎陣列處理

ndarray 的屬性、索引與切割

郭耀仁 Yao-Jen Kuo
Aug 21 · 5 min read
Photo by Matt Reames on Unsplash

NumPy is the fundamental package for scientific computing with Python. It contains a powerful N-dimensional array object:ndarray.

numpy.org

TL; DR 摘要

這個小節簡介了常用的 ndarray 屬性、索引與切割方法,除了能夠沿用和 list 相同的操作,還具備了針對多維數值陣列索引切割更為便捷的寫法以及資料科學家熱愛的華麗索引(Fancy Indexing)與布林索引(Boolean Indexing)。

ndarray 的屬性

創建一個 ndarray 以後可以運用 Jupyter Notebook 或 Google Colab 這樣基於 ipython 的介面以 arr.<TAB> 的方式獲取提示,提示會顯示出該類別可供使用者呼叫的方法或檢視的屬性;其中 ndarray 較常被用到的屬性有:

  • arr.ndim :檢視 arr 有幾個維度
  • arr.shape :檢視 arr 的外型
  • arr.size :檢視 arr 的資料筆數,對一維陣列的意涵就像內建函數 len() 作用在 list 上一般
  • arr.dtype :檢視 arr 中同質資料的型態
## ndim:
## 0
## 1
## 2
## shape:
## ()
## (3,)
## (3, 3)
## size:
## 1
## 3
## 9
## dtype:
## int64
## int64
## int64

其中 ndarray 較少被檢視的屬性有:

  • arr.itemsize :檢視 arr 中每一筆資料所使用的位元組(bytes)多寡
  • arr.nbytes :檢視 arr 整個物件所使用的位元組(bytes)多寡,一般來說我們期待 arr.nbytes = arr.itemsize x arr.size
## int64
## 8
## 40
## 40

ndarray 的索引(indexing)

ndarray 中取出單個資料值的方式與 list 相同,使用 [INDEX] 取值,索引值同樣由左至右從 0 算起,由右至左從 -1 算起,在參數命名上稱呼最左邊為起始(start)、最右邊為終止(stop)。

## From start to stop:
## 55
## 66
## 56
## 5566
## From stop to start:
## 5566
## 56
## 66
## 55

面對二維以上的陣列,ndarray 支援使用 [i, j, …] 的方式取出位於第 i 列(row)、第 j 欄(column)… 的資料。

## [[7 4 8 5]
## [7 3 7 8]
## [5 4 8 8]]
## 3
## 4

ndarray 的索引與 list 同樣具有更新的特性,值得注意的是由於同質資料緣故,更新資料會被隱性地轉換型態。

## [[7 4 8 5]
## [7 3 7 8]
## [5 4 8 8]]
## [[ 7 4 8 5]
## [ 7 3 7 8]
## [ 5 4 8 5566]]
## [[ 7 4 8 5]
## [ 7 3 7 8]
## [ 5 4 8 55]]
## [[7 4 8 5]
## [7 3 7 8]
## [5 4 8 0]]

ndarray 與 list 相同的切割(slicing)

ndarray 中取出多個資料值的方式與 list 相同,使用 [start:stop:step] 取出陣列的片段,如果沒有指定 start 預設值 0、 stop 預設值 arr.size 意即最右邊、 step 預設值 1;比較容易讓使用者困惑的是當 step 設為負整數時候的效果為反轉數列。

## [10 11 12 13 14 15 16 17 18 19]
## [10 12 14 16 18]
## [10 11 12 13 14]
## [15 16 17 18 19]
## [19 18 17 16 15 14 13 12 11 10]

ndarray 特別的索引

除了與 list 相同支援 [INDEX][start:stop:step] 的索引、切割方式,ndarray 額外支援兩種資料科學家熱愛的索引寫法:

  • 華麗索引(Fancy Indexing)
  • 布林索引(Boolean Indexing)

華麗索引(Fancy Indexing)指的是以陣列傳入不規則的索引值選取資料值,不用遷就 [start:stop:step] 所生成的規則索引陣列。

## [45 48 65 68 68 10 84 22 37 88]
## [45 65 37]

布林索引(Boolean Indexing)指的是以外觀相同的陣列傳入布林值,將位置為 True 的資料篩選出來。

## [45 48 65 68 68 10 84 22 37 88]
## [45 65 37]

其中外觀相同的布林值陣列因為能透過 ndarray 的向量化特性搭配判斷條件輕鬆產生,因此這通常是資料科學家最喜歡使用的切割、篩選方式。

## [45 48 65 68 68 10 84 22 37 88]
## [ True False True False False False False False True False]
## [45 65 37]

截至目前為止,我們掌握了 ndarray 的屬性、索引與切割,並準備好在後續的小節研究如何對數值陣列做其他的操作、處理及運算。

DataInPoint

DataInPoint 是一個超棒的資料科學專欄,主題涵蓋資料、程式、機器學習與高效能運算。

郭耀仁 Yao-Jen Kuo

Written by

Could that data be any tidier? It is always nice to meet a data enthusiast / 2:43 marathon runner.

DataInPoint

DataInPoint 是一個超棒的資料科學專欄,主題涵蓋資料、程式、機器學習與高效能運算。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade