菜鳥數據科學入門03 - NumPy 數組基礎和基本操作

為什麼用 NumPy?

NumPy 是一個用於科學計算的基礎 Python 庫(安裝說明)。它可以讓你在 Python 中使用向量和數學矩陣,以及許多用 C 語言實現的底層函數。

  • 簡潔優雅:當下大部分數據的組織結構是向量、矩陣或多維數組,NumPy 最重要的一個特點是 N 維數組對象(ndarray)。
  • 效率高:方便地計算一組數值,而不用寫複雜的循環。
  • 靈活兼容:除了擅長科學計算,NumPy 還可以用作通用數據多維容器,可無縫對接各種各樣的資料庫。
  • 敲門磚:在數據科學中,有效的存儲和操作數據是基礎能力。如果想通過 Python 學習數據科學或者機器學習,就必須學習 NumPy。

在 Notebook 中導入 NumPy:

import numpy as np

什麼是數組

數組是將數據組織成若干個維度的數據塊。

Array : data about relationships

  • 一維數組是向量(Vectors),由一個整數索引有序元素序列。
  • 二維數組是矩陣(Matrics),用一對整數(行索引和列索引)索引元素。
  • N 維數組(Arrays)是一組由 n 個整數的元組進行索引的、具有相同數據類型的元素集合。

創建數組

NumPy 的核心是數組(arrays)。

array 創建數組

In[]: np.array([1, 4, 2, 5, 3])nnOut[]: array([1, 4, 2, 5, 3])n

在 NumPy 數組中,數據類型需要一致,否則,會嘗試「向上兼容」,比如生成一個包含浮點數的數組,輸出時每個元素都變成了浮點型:

In[]: np.array([3.14, 4, 2, 3])nnOut[]: array([ 3.14, 4. , 2. , 3. ])n

NumPy 還可以用循環生成數組:

In[]: np.array([range(i, i + 3) for i in [2, 4, 6]])nnOut[]: array([[2, 3, 4], [4, 5, 6], [6, 7, 8]])n

full 生成一個 3 行 5 列的數組:

In[]: np.full((3, 5), 3.14)nnOut[]: array([[ 3.14, 3.14, 3.14, 3.14, 3.14], [ 3.14, 3.14, 3.14, 3.14, 3.14], [ 3.14, 3.14, 3.14, 3.14, 3.14]])n

arange 等距填充數組:

(arange 是 Python 內置函數 range 的數組版,返回的是一個 ndarray 而不是 list)

# Starting at 0, ending at 20, stepping by 2nnIn[]: np.arange(0, 20, 2)nnOut[]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])n

linspace 線性填充數組:

# Create an array of five values evenly spaced between 0 and 1nnIn[]: np.linspace(0, 1, 5)nnOut[]: array([ 0. , 0.25, 0.5 , 0.75, 1. ])n

random 生成隨機數組:

# Create a 3x3 array of random integers in the interval [0, 10)nnIn[]: np.random.randint(0, 10, (3, 3))nnOut[]: array([[2, 3, 4], [5, 7, 8], [0, 5, 0]])n

btw 數組索引從 0 開始

數組切片

NumPy 中的切片語法:x[start:stop:step],如果沒有賦值,默認值 start=0, stop=size of dimension, step=1。

(上圖最後一個圖形,arr[1, :2] 應該是 (1,2) 一行二列矩陣??)

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])nnIn[]: x[::2] # every other elementnnOut[]:array([0, 2, 4, 6, 8])nnnarray([[12, 5, 2, 4], [ 7, 6, 8, 8], [ 1, 6, 7, 7]])n nIn[]: x2[:3, ::2] # all rows, every other columnnnOut[]:array([[12, 2], [ 7, 8], [ 1, 7]])n

複製數組切片

x2 = array([[99 5 2 4] [ 7 6 8 8] [ 1 6 7 7])n nIn[]: x2_sub_copy = x2[:2, :2].copy() print(x2_sub_copy)nnOut[]:[[99 5] [ 7 6]]n

數組轉置和軸對換

reshape:

In[]: arr = np.arange(15).reshape((3,5))n arrn nOut[]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])n

轉置(transpose)是重塑(reshape)的一種特殊形式,返回源數據的視圖而不進行複製。

In[]: arr.TnnOut[]: array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])n

連接和拆分數組

concatenate連接數組:

In[]: grid = np.array([[1, 2, 3], [4, 5, 6]])n np.concatenate([grid, grid])nnOut[]: array([[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]])nn# concatenate along the second axis (zero-indexed)nnIn[]: np.concatenate([grid, grid], axis=1)nnOut[]: array([[1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6]])n

vstack合併到數據行, hstack 合併到數據列

In[]: x = np.array([1, 2, 3])n grid = np.array([[9, 8, 7], [6, 5, 4]]) # vertically stack the arraysn np.vstack([x, grid])nnOut[]:array([[1, 2, 3], [9, 8, 7], [6, 5, 4]])n

拆分數組的函數包括: np.split, np.hsplit, np.vsplit

In[]: x = np.arange(8.0)n np.split(x, [3, 5, 6, 10])nnOut[]: [array([ 0., 1., 2.]),n array([ 3., 4.]),n array([ 5.]),n array([ 6., 7.]),n array([], dtype=float64)]n

使用 mask 快速截取數據

傳遞給數組一個與它有關的條件式,然後它就會返回給定條件下為真的值。

In[]: norm10 = np.random.normal(10,3,5)n mask = norm10 > 9n masknnOut[]:array([False, True, False, True, False], dtype=bool)nIn[]: print(Values above 9:, norm10[mask])nnOut[]: (Values above 9:, array([ 13.69383139, 13.49584954]))n

在生成圖形時也非常好用:

dimport matplotlib.pyplot as pltnna = np.linspace(0, 2 * np.pi, 50)nb = np.sin(a)nplt.plot(a,b)nmask = b >= 0nplt.plot(a[mask], b[mask], bo)nmask = (b >= 0) & (a <= np.pi / 2)nplt.plot(a[mask], b[mask], go)nplt.show()n

在程序中用條件式選擇了圖中不同的點。藍色的點(也包含圖中的綠點,只是綠點覆蓋了藍點),顯示的是值大於零的點。綠點顯示的是值大於 0 小於 Pi / 2 的點。

廣播 Broadcasting

當不同 shape 的數組進行運算(按位加/按位減的運算,而不是矩陣乘法的運算)時,(某個維度上)小的數組就會沿著(同一維度上)大的數組自動填充。廣播雖然是一個不錯的偷懶辦法,但是效率不高、降低運算速度通常也為人詬病。

The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations. Subject to certain constraints, the smaller array is 「broadcast」 across the larger array so that they have compatible shapes.

via Broadcasting — NumPy v1.13 Manual

廣播的原理(via Broadcast Visualization):

參考資料

  • NumPy.org
  • Python Data Science Handbook
  • 利用Python進行數據分析
  • Scipy lecture notes
  • Enter The Matrix
  • 使用 Python 進行科學計算:NumPy入門
  • Broadcasting — NumPy v1.13 Manual
  • EricsBroadcastingDoc - SciPy wiki dump
  • Broadcast Visualization — astroML 0.2 documentation

本系列文章

  • 菜鳥數據科學入門01 - 工具包概略
  • 菜鳥數據科學入門02 - IPython 基礎


推薦閱讀:

Sketch #0 如何只用方/圓/線和快捷鍵在Sketch里畫插畫
10節課教會你攝影
《ePub指南——從入門到放棄》編著:赤霓(第2版)
【美妝老師解小昕】彩妝貼-歐式小煙熏

TAG:数据科学 | Python | 教程 |