Numpy基礎實用技巧概覽
來自專欄馬索萌帶你玩轉編程36 人贊了文章
在閱讀本文之前,你需要基礎的Python知識,如果有興趣,可以看看下面這篇Python 3教程
馬索萌:Python 3 15分鐘入門Numpy是一個在Python中處理向量和矩陣的庫,它已經在事實上成為了Python中數據處理、機器學習、科學計算的基礎。下面我們來看看Numpy中最基礎最實用的這些技巧吧,學會了這些你就已經能夠解決不少問題啦。下面所有的代碼的測試環境為Python 3.6,Numpy 1.14.3。
第一步,import numpy
In []: import numpy as np # 通常我們把numpy簡寫為np
創建一個numpy數組
# 可以手動指定所有的元素In []: a = np.array([1, 2, 3, 4, 5])In []: print(a)Out[]: [1 2 3 4 5]# 也可以指定一個序列的範圍,np.arange的使用方法與Python自帶的range類似In []: r = np.arange(0, 10, 2)Out[]: array([0, 2, 4, 6, 8])# 指定形狀,生成元素全是0的數組In []: a = np.zeros((3, 4))In []: aOut[]: array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) # zeros默認類型為float# 指定形狀,生成元素全是1的數組In []: a = np.ones((3, 4))In []: aOut[]: array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) # ones的默認類型也是float
對於一個數組來說,有下面兩個常用屬性
In []: a = np.array([[1, 2, 3], [4, 5, 6]])# ndarray.shape用來存儲數組的形狀In []: a.shapeOut[]: (2, 3)# ndarray.dtype用來存儲數組元素的類型In []: a.dtypeOut[]: dtype(int32)
在創建數組的時候可以顯示指定元素類型,不然的話會自動推斷到最符合的默認類型,比如整數會推斷到int32,小數會推斷到float64(默認情況,可以通過配置文件改變默認推斷類型)。
# 由於指定了類型,所以元素會變成指定類型In []: a = np.array([1, 2, 3], dtype=np.float) In []: a.dtypeOut[]: dtype(float64)# 在np.ones和np.zeros裡面也可以指定元素類型In []: a = np.ones((3, 4), dtype=np.int)In []: aOut[]: array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]) # 現在元素是整數型的了
改變數組的形狀:Reshape
# 首先我們生成一個1行12列的一維數組In []: a = np.arange(0, 12)In []: aOut[]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])# 下面我們將a的元素重排成為3行4列,並存儲到b中In []: b = a.reshape((3,4))In []: bOut[]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])# 讓我們來試試改變一下某個元素的值In []: b[0][0] = 100In []: bOut[]: array([[100, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])# 再來看看a的值In []: aOut[]: array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
上面我們改變b的值的時候a的值也改變了,這是為什麼呢?因為a和b的數據其實是共享的,在內存中他們都是一個一維的數組,只不過b把這堆數據「看成了」3行4列,a把這堆數據「看成了」1行12列。這是初學者容易踩的一個坑,請注意。如果要使a與b的數據獨立,則需要新建一個數組,可以使用np.ndarray.copy這個方法,如下
In []: b = a.reshape((3, 4)).copy()
這樣的話改變b的值就不會影響a了。
向量與矩陣的基本運算
# 首先我們生成兩個數組備用In []: x = np.arange(1, 5).reshape((2, 2))In []: xOut[]: array([[1, 2], [3, 4]])In []: y = np.arange(5, 9).reshape((2, 2))In []: yOut[]: array([[5, 6], [7, 8]])# 矩陣的加法,用+即可In []: x + yOut[]: array([[ 6, 8], [10, 12]])# 矩陣的減法,用-即可In []: x - yOut[]: array([[-4, -4], [-4, -4]])# *代表兩個矩陣逐項相乘,要求兩個矩陣形狀相同,不是矩陣的乘法In []: x * yOut[]: array([[ 5, 12], [21, 32]])# /代表兩個矩陣逐項相除,要求矩陣形狀相同In []: x / yOut[]: array([[0.2 , 0.33333333], [0.42857143, 0.5 ]])# np.ndarray.dot才是矩陣的乘法(一維的情況是向量的內積)In []: x.dot(y)Out[]: array([[19, 22], [43, 50]])# 我們也可以用@來表示矩陣的乘法,效果同np.ndarray.dotIn []: x @ yOut[]: array([[19, 22], [43, 50]])# 求數組所有元素的和In []: x.sum()Out[]: 10# 求數組最大和最小元素In []: x.max()Out[]: 4In []: x.min()Out[]: 1# 轉置In []: x.transpose()Out[]:array([[1, 3], [2, 4]])# 求逆In []: np.linalg.inv(x)Out[]:array([[-2. , 1. ], [ 1.5, -0.5]])# 特徵值In []: np.linalg.eig(x)Out[]:(array([-0.37228132, 5.37228132]), array([[-0.82456484, -0.41597356], [ 0.56576746, -0.90937671]]))# 解線性方程組In []: b = np.array([10, 20])In []: np.linalg.solve(x, b)Out[]: array([0., 5.])
索引與元素選取
# 一維數組的索引跟list很像In []: a = np.arange(0, 12)In []: aOut[]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])In []: a[2:5]Out[]: array([2, 3, 4])In []: a[2:6:2]Out[]: array([2, 4])In []: a[10:3:-1]Out[]: array([10, 9, 8, 7, 6, 5, 4])# 多維數組的索引有很多種方式In []: a = np.arange(1, 10).reshape((3, 3))In []: aOut[]:array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 選取某一行In []: a[0]Out[]: array([1, 2, 3])# 選取某一列In []: a[:, 0]Out[]: array([1, 4, 7])# 選取某一個元素In []: a[0][0]Out[]: 1# 或者這樣寫也行In []: a[0,0]Out[]: 1# 選取某個範圍的元素In []: a[1:3, 1:3]Out[]:array([[5, 6], [8, 9]])# 下面的例子比較有趣,可以用一個數組當另一個數組的索引In []: b = a >= 3In []: bOut[]:array([[False, False, True], [ True, True, True], [ True, True, True]])In []: a[b]Out[]: array([3, 4, 5, 6, 7, 8, 9])
遍曆數組
# 對於二維數組默認是按行遍歷In []: a = np.arange(1, 10).reshape((3, 3))In []: for row in a: ...: print(row) ...:[1 2 3][4 5 6][7 8 9] # 對於一維數組默認是按元素遍歷In []: bOut[]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])In []: for e in b: ...: print(e) ...:123456789# 我們當然也可以用最直接的方法遍曆元素In []: row, col = a.shapeIn []: for i in range(row): ...: for j in range(col): ...: print(a[i, j]) ...:123456789
以上就是Numpy的基礎操作概覽。
推薦閱讀:
※損失函數——交叉熵損失函數
※自動化掃雷工具:Python+機器學習
※如何計算卷積層中對應參數個數?
※每周一個機器學習小項目004-RNN實現(草稿)