AI探索(四)NumPy庫的使用
NumPy(Numerical Python)
是 Python 語言的一個擴充套件程式庫,支援大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。
umPy 是一個執行速度非常快的數學庫,主要用於陣列計算,包含:
- 一個強大的N維陣列物件 ndarray
- 廣播功能函式
- 整合 C/C++/Fortran 程式碼的工具
- 線性代數、傅立葉變換、隨機數生成等功能
NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪相簿)一起使用, 這種組合廣泛用於替代 MatLab,是一個強大的科學計算環境,有助於我們通過 Python 學習資料科學或者機器學習。
SciPy 是一個開源的 Python 演算法庫和數學工具包。
SciPy 包含的模組有最優化、線性代數、積分、插值、特殊函式、快速傅立葉變換、訊號處理和影象處理、常微分方程求解和其他科學與工程中常用的計算。
Matplotlib 是 Python 程式語言及其數值數學擴充套件包 NumPy 的視覺化操作介面。它為利用通用的圖形使用者介面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 嚮應用程式嵌入式繪圖提供了應用程式介面(API)。
NumPy 最重要的一個特點是其 N 維陣列物件 ndarray,它是一系列同類型資料的集合,以 0 下標為開始進行集合中元素的索引。
建立一個 ndarray 只需呼叫 NumPy 的 array 函式即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
示例1: 一維陣列
import numpy as np
a = np.array([1,2,3])
print a
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py
[1 2 3]
Process finished with exit code 0
示例2:二維陣列
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print a
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py
[[1 2 3]
[4 5 6]]
Process finished with exit code 0
示例3:二維陣列
import numpy as np
a = np.array([1,2,3],ndmin = 2)
print a
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py
[[1 2 3]]
Process finished with exit code 0
示例4:二維陣列
import numpy as np
a = np.array([1,2,3],ndmin = 2, dtype = complex)
print a
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py
[[1.+0.j 2.+0.j 3.+0.j]]
Process finished with exit code 0
NumPy 資料型別
numpy 支援的資料型別比 Python 內建的型別要多很多,基本上可以和 C 語言的資料型別對應上,其中部分型別對應為 Python 內建的型別。
下表列舉了常用 NumPy 基本型別。
資料型別物件(dtype)
numpy.dtype(object, align, copy)
- object - 要轉換為的資料型別物件
- align - 如果為true, 填充欄位使其類似C的結構體
- copy - 複製dtype物件, 如果為false,則是對內建資料型別物件的引用
示例:
# -*- coding: UTF-8 -*-
import numpy as np
#使用標量型別
dt = np.dtype(np.int32)
print(dt)
# int8, int16, int32, int64 四種資料型別可以使用字串 'i1', 'i2','i4','i8' 代替
dt = np.dtype('i8')
print(dt)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py
int32
int64
Process finished with exit code 0
下面例項展示結構化資料型別的使用,型別欄位和對應的實際型別將被建立
# -*- coding: UTF-8 -*- import numpy as np dt = np.dtype([('age',np.int8)]) print(dt) a = np.array([(10,),(20,),(30,)], dtype=dt) print(a) print(a['age'])
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [('age', 'i1')] [(10,) (20,) (30,)] [10 20 30] Process finished with exit code 0
示例:
# -*- coding: utf-8 -*- import numpy as np student = np.dtype([('name','S20'), ('age','i1'), ('marks','f4')]) print(student) a = np.array([('abc',21,50),('xyz',18,75)], dtype=student) print(a)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [('name', 'S20'), ('age', 'i1'), ('marks', '<f4')] [('abc', 21, 50.) ('xyz', 18, 75.)] Process finished with exit code 0
Numpy陣列
NumPy 陣列的維數稱為秩(rank),一維陣列的秩為 1,二維陣列的秩為 2,以此類推。
在 NumPy中,每一個線性的陣列稱為是一個軸(axis),也就是維度(dimensions)。比如說,二維陣列相當於是兩個一維陣列,其中第一個一維陣列中每個元素又是一個一維陣列。所以一維陣列就是 NumPy 中的軸(axis),第一個軸相當於是底層陣列,第二個軸是底層數組裡的陣列。而軸的數量——秩,就是陣列的維數。
很多時候可以宣告 axis。axis=0,表示沿著第 0 軸進行操作,即對每一列進行操作;axis=1,表示沿著第1軸進行操作,即對每一行進行操作。
NumPy 的陣列中比較重要 ndarray 物件屬性有:
ndarray.ndim用於返回陣列的維數,等於秩
示例:
# -*- coding: utf-8 -*- import numpy as np a = np.arange(24) #a現在只有1個緯度 print(a.ndim)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py 1 Process finished with exit code 0
ndarray.shape
ndarray.shape 表示陣列的維度,返回一個元組,這個元組的長度就是維度的數目,即 ndim 屬性(秩)。比如,一個二維陣列,其維度表示"行數"和"列數"。
ndarray.shape 也可以用於調整陣列大小。
示例:
# -*- coding: utf-8 -*- import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.shape) a.shape = (6,1) print(a) a.shape = (1,6) print(a)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py (2, 3) [[1] [2] [3] [4] [5] [6]] [[1 2 3 4 5 6]] Process finished with exit code 0
ndarray.itemsize
ndarray.itemsize 以位元組的形式返回陣列中每一個元素的大小。
例如,一個元素型別為 float64 的陣列 itemsiz 屬性值為 8(float64 佔用 64 個 bits,每個位元組長度為 8,所以 64/8,佔用 8 個位元組),又如,一個元素型別為 complex32 的陣列 item 屬性為 4(32/8)。
示例:
# -*- coding: utf-8 -*- import numpy as np x = np.array([1,2,3,4,5],dtype=np.int8) print(x) print(x.itemsize) y = np.array([1,2,3,4,5], dtype=np.float64) print(y) print(y.itemsize)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [1 2 3 4 5] 1 [1. 2. 3. 4. 5.] 8 Process finished with exit code 0
ndarray 陣列除了可以使用底層 ndarray 構造器來建立外,也可以通過以下幾種方式來建立。
numpy.empty 方法用來建立一個指定形狀(shape)、資料型別(dtype)且未初始化的陣列:
numpy.empty(shape, dtype = float, order = 'C')
示例:
# -*- coding: utf-8 -*- import numpy as np x = np.empty([3,2], dtype=int) print(x)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [[ 0 -9223363263373412019] [ 140375703420932 140375703442528] [ 4345035248 140375703442504]] Process finished with exit code 0
注意 − 陣列元素為隨機值,因為它們未初始化。
numpy.zeros
建立指定大小的陣列,陣列元素以 0 來填充:
numpy.zeros(shape, dtype = float, order = 'C')
示例:
# -*- coding: utf-8 -*- import numpy as np # 預設為浮點數 x = np.zeros(5) print(x) # 設定型別為整數 y = np.zeros((5,), dtype=np.int) print(y) # 自定義型別 z = np.zeros((2,2), dtype=[('x', 'i4'), ('y','i4')]) print(z)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [0. 0. 0. 0. 0.] [0 0 0 0 0] [[(0, 0) (0, 0)] [(0, 0) (0, 0)]] Process finished with exit code 0
numpy.ones
建立指定形狀的陣列,陣列元素以 1 來填充:
numpy.ones(shape, dtype = None, order = 'C')
示例:
# -*- coding: utf-8 -*- import numpy as np # 預設為浮點數 x = np.ones(5) print(x) # 自定義型別 x = np.ones([2,2],dtype=int) print(x)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [1. 1. 1. 1. 1.] [[1 1] [1 1]] Process finished with exit code 0
建立標準正態分佈陣列:
# -*- coding: utf-8 -*- import numpy as np a = np.random.randn(2,3) print(a)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [[-0.16777072 1.15536929 0.15206009] [ 0.36466659 0.39643679 -1.06021005]] Process finished with exit code 0
建立隨機分佈整數型陣列。
利用 randint([low,high],size) 建立一個整數型指定範圍在 [low.high] 之間的陣列:
# -*- coding: utf-8 -*- import numpy as np a = np.random.randint(100,200,(3,3)) print(a)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [[172 166 115] [191 126 165] [195 171 198]] Process finished with exit code 0
從已有的陣列建立陣列
numpy.asarray
numpy.asarray 類似 numpy.array,但 numpy.asarray 只有三個,比 numpy.array 少兩個。
numpy.asarray(a, dtype = None, order = None)
示例:
# -*- coding: utf-8 -*- import numpy as np # 將列表轉換為ndarray x = [1,2,3] a = np.asarray(x) print(a) # 將元組列表轉換為 ndarray x = [(1,2,3),(4,5)] a = np.asarray(x) print(a) # 設定了dtype引數 x = [1,2,3] a = np.asarray(x, dtype=float) print(a)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [1 2 3] [(1, 2, 3) (4, 5)] [1. 2. 3.] Process finished with exit code 0
numpy.frombuffer
numpy.frombuffer 用於實現動態陣列。
numpy.frombuffer 接受 buffer 輸入引數,以流的形式讀入轉化成 ndarray 物件。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
注意:buffer 是字串的時候,Python3 預設 str 是 Unicode 型別,所以要轉成 bytestring 在原 str 前加上 b。
示例:
# -*- coding: utf-8 -*- import numpy as np s = 'Hello world!' a = np.frombuffer(s, dtype='S1') print(a)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py ['H' 'e' 'l' 'l' 'o' ' ' 'w' 'o' 'r' 'l' 'd' '!'] Process finished with exit code 0
numpy.fromiter
numpy.fromiter 方法從可迭代物件中建立 ndarray 物件,返回一維陣列。
numpy.fromiter(iterable, dtype, count=-1)
示例:
# -*- coding: utf-8 -*- import numpy as np # 使用 range 函式建立列表物件 list = range(5) it = iter(list) # 使用迭代器建立 ndarray x = np.fromiter(it, dtype=float) print(x)
輸出:
/usr/bin/python2.7 /Users/jackey/Documents/python/tensorflow/numpydemo.py [0. 1. 2. 3. 4.] Process finished with exit code 0