前置機器學習(三):30分鐘掌握常用NumPy用法
NumPy支援大量的維度陣列與矩陣運算,是針對陣列運算的Python庫。
本文收錄於機器學習前置教程系列。
一、Python基礎
我們首先鞏固一下Python的基礎知識。Python有6種標準資料型別:Number(數字),String(字串),List(列表),Tuple(元組),Set(集合),Dictionary(字典)。
其中:
不可變資料:Number(數字)、String(字串)、Tuple(元組)。
可變資料:List(列表)、Dictionary(字典)、Set(集合)。
1. List[列表]
列表由方括號 [ ]
包裹,每個位置的數值可變。
list = [1, 2, 3, 4, 5, 6]
根據位置取值,如取第2個位置的值:
list[1]
得到 2
。
從第3個位置取值,到列表末尾的所有值:
a[2:]
得到 [3, 4, 5, 6]
。
改變指定位置的值:
list[0] = 9
列表a此時輸出為 [9, 2, 3, 4, 5, 6]
。
2. Tuple(元組)
元組由圓括號 ( )
包裹,每個位置的數值不可變。允許資料重複。
tuple = ('a', 'a, 'c', 1, 2, 3.0)
輸出('a', 'a', 'c', 1, 2, 3.0)
。
取最後一個位置的元素:
tuple[-1]
輸出 3.0
。
元組操作與列表類似,但不可改變元組內元素的值,否則會報錯。
tuple[2] = 'caiyongji'
3. Set{集合}
集合是包含不重複元素的集體,由花括號 { }
包裹。
set1 = {'a','b','c','a'}
set2 = {'b','c','d','e'}
set1的輸出結果為:{'a', 'b', 'c'}
。注意:集合會刪除重複元素。
set2的輸出結果為:{'b', 'c', 'd', 'e'}
。
與列表和元組不同,集合是不可下標的,如:
set1[0]
下面,我們來看看集合運算。
set1和set2的差集:
set1 - set2
#set1.difference(set2)
輸出:{'a'}
。
set1和set2的並集:
set1 | set2
#set1.union(set2)
輸出:{'a', 'b', 'c', 'd', 'e'}
。
set1和set2的交集:
set1 & set2
#set1.intersection(set2)
輸出:{'b', 'c'}
。
set1和set2的對稱差集:
set1 ^ set2
#(set1 - set2) | (set2 - set1)
#set1.symmetric_difference(set2)
輸出:{'a', 'd', 'e'}
。
以上差集、並集、交集、對稱差集都有對應的集合方法,可以註釋方法自己試試。
4. Dictionary{字典:Dictionary}
字典是一種對映關係,是無序有鍵值對(key-value)集合。字典不允許重複的鍵(key),但允許重複的值(value)。
dict = {'gongzhonghao':'caiyongji','website':'caiyongji.com', 'website':'blog.caiyongji.com'}
字典輸出{'gongzhonghao': 'caiyongji', 'website': 'blog.caiyongji.com'}
,需要注意的是,當字典包含重複鍵,後面的會覆蓋前面的元素。
dict['gongzhonghao']
輸出字串 caiyongji
。我們也可以使用get
方法得到相同效果。
dict.get('gongzhonghao')
檢視所有的鍵(key):
dict.keys()
輸出 dict_keys(['gongzhonghao', 'website'])
。
檢視所有的值(value):
dict.values()
輸出 dict_values(['caiyongji', 'blog.caiyongji.com'])
。
改變某一項的值:
dict['website'] = 'caiyongji.com'
dict
輸出 {'gongzhonghao': 'caiyongji', 'website': 'caiyongji.com'}
。
瞭解了Python的資料型別,我們可以學著使用NumPy了。
二、Numpy常見用法
1. 建立陣列
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
arr的輸出為array([1, 2, 3, 4, 5])
。
我們輸入以下程式碼建立二維陣列:
my_matrix = [[1,2,3],[4,5,6],[7,8,9]]
mtrx= np.array(my_matrix)
mtrx的輸出如下:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
2. 索引與切片
索引一維陣列與二位陣列如下:
print('arr[0]=',arr[0],'mtrx[1,1]=',mtrx[1,1])
輸出 arr[0]= 1 mtrx[1,1]= 5
。
對陣列切片:
arr[:3]
輸出結果為 array([1, 2, 3])
。
倒數切片:
arr[-3:-1]
輸出 array([3, 4])
。
加入步長(step),步長決定了切片間隔:
arr[1:4:2]
輸出 array([2, 4])
。
二維陣列切片:
mtrx[0:2, 0:2]
輸出,程式碼意義為取第1、2行,第1、2列:
array([[1, 2],
[4, 5]])
3. dtype
NumPy的dtpe有如下幾種資料型別:
- i - integer
- b - boolean
- u - unsigned integer
- f - float
- c - complex float
- m - timedelta
- M - datetime
- O - object
- S - string
- U - unicode string
- V - fixed chunk of memory for other type ( void )
import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array(['apple', 'banana', 'cherry'])
print('arr1.dtype=',arr1.dtype,'arr2.dtype=',arr2.dtype)
輸出為 arr1.dtype= int32 arr2.dtype= <U6
。arr1資料型別為int32,arr2的<U6表示不超過6位Unicode字串。
我們可以指定dtype型別。
arr = np.array(['1', '2', '3'], dtype='f')
輸出結果位 array([1., 2., 3.], dtype=float32)
,其中1.表示1.0,可以看到dtype被設定位float32資料型別。
4. 一般方法
4.1 arange
np.arange(0,101,2)
輸出結果如下,該命令表示,在[0,101)區間內均勻地生成資料,間隔步長為2。
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50,
52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100])
4.2 zeros
np.zeros((2,5))
輸出結果如下,該命令表示,輸出2行5列全為0的矩陣(二維陣列)。
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
4.3 ones
np.ones((4,4))
輸出結果如下,該命令表示,輸出4行4列全為1的矩陣。
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
4.4 eye
np.eye(5)
輸出結果如下,該命令表示,輸出對角線為1其餘全為0的5行5列方陣。方陣為行列相同的矩陣。
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
4.5 rand
np.random.rand(5,2)
命令生成5行2列的隨機數。
array([[0.67227856, 0.4880784 ],
[0.82549517, 0.03144639],
[0.80804996, 0.56561742],
[0.2976225 , 0.04669572],
[0.9906274 , 0.00682573]])
如果想保證隨機出與本例一樣的隨機數,可使用與本例相同的隨機種子。通過np.random.seed
方法設定。
np.random.seed(99)
np.random.rand(5,2)
4.6 randint
np.random.randint(0,101,(4,5))
輸出結果如下,該命令表示,在[0,101)區間內隨機選取整數生成4行5列的陣列。
array([[ 1, 35, 57, 40, 73],
[82, 68, 69, 52, 1],
[23, 35, 55, 65, 48],
[93, 59, 87, 2, 64]])
4.7 max min argmax argmin
我們先隨機生成一組數:
np.random.seed(99)
ranarr = np.random.randint(0,101,10)
ranarr
輸出:
array([ 1, 35, 57, 40, 73, 82, 68, 69, 52, 1])
檢視最大最小值分別為:
print('ranarr.max()=',ranarr.max(),'ranarr.min()=',ranarr.min())
輸出結果為ranarr.max()= 82 ranarr.min()= 1
。
其中最大值和最小值的索引位置分別為:
print('ranarr.argmax()=',ranarr.argmax(),'ranarr.argmin()=',ranarr.argmin())
輸出:ranarr.argmax()= 5 ranarr.argmin()= 0
。注意,當出現多個最大最小值時,取前面的索引位置。
三、NumPy進階用法
1. reshape
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)
其中,arr為一維陣列,newarr為二位陣列,其中行為4,列為3。
print('arr.shape=',arr.shape,'newarr.shape=',newarr.shape)
輸出 arr.shape= (12,) newarr.shape= (4, 3)
。
newarr
的輸出結果如下:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
2. 合併與分割
2.1 concatenate
一維陣列合並:
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
arr
輸出: array([1, 2, 3, 4, 5, 6])
。
二維陣列合並:
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2))
arr
輸出為:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
我們新增引數axis=1:
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2), axis=1)
arr
輸出為:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
我們把滑鼠移到 concatenate
,按快捷鍵Shift+Tab
檢視方法說明。可以看到concatenate
方法沿著現有的軸進行合併操作,預設axis=0。當我們設定axis=1後,合併操作沿著列進行。
2.2 array_split
分割陣列:
arr = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])
newarr = np.array_split(arr, 3)
newarr
newarr的值為:
[array([[1, 2],
[3, 4]]),
array([[5, 6],
[7, 8]]),
array([[ 9, 10],
[11, 12]])]
3. 搜尋與篩選
3.1 搜尋
NumPy可通過where
方法查詢滿足條件的陣列索引。
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
x = np.where(arr%2 == 0)
x
輸出:
(array([1, 3, 5, 7], dtype=int64),)
3.2 篩選
我們看看下面的程式碼:
bool_arr = arr > 4
arr[bool_arr]
輸出:array([5, 6, 7, 8])
。這回我們返回的是陣列中的值,而非索引。
我們看看bool_arr
的內容究竟是什麼。
bool_arr
的輸出為:
array([False, False, False, False, True, True, True, True])
所以我們可以用以下命令代替以上篩選。
arr[arr > 4]
4. 排序
sort
方法可對ndarry陣列進行排序。
arr = np.array(['banana', 'cherry', 'apple'])
np.sort(arr)
輸出排序後的結果:array(['apple', 'banana', 'cherry'], dtype='<U6')
。
針對二維陣列,sort
方法對每一行單獨排序。
arr = np.array([[3, 2, 4], [5, 0, 1]])
np.sort(arr)
輸出結果:
array([[2, 3, 4],
[0, 1, 5]])
5. 隨機
5.1 隨機概率
如果我們想完成如下需求該如何處理?
生成包含100個值的一維陣列,其中每個值必須為3、5、7或9。
將該值為3的概率設定為0.1。
將該值為5的概率設定為0.3。
將該值為7的概率設定為0.6。
將該值為9的概率設定為0。
我們用如下命令解決:
random.choice([3, 5, 7, 9], p=[0.1, 0.3, 0.6, 0.0], size=(100))
輸出結果:
array([7, 5, 7, 7, 7, 7, 5, 7, 5, 7, 7, 5, 5, 7, 7, 5, 3, 5, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 5, 3, 7, 5, 7, 5, 7, 3, 7, 7, 3, 7, 7, 7, 7, 3,
5, 7, 7, 5, 7, 7, 5, 3, 5, 7, 7, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 5,
7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 3, 7, 7, 5, 7, 5, 7, 5, 7, 7, 5, 7,
7, 7, 7, 7, 7, 3, 5, 5, 7, 5, 7, 5])
5.2 隨機排列
5.2.1 permutation
根據原有陣列生成新的隨機排列。
np.random.seed(99)
arr = np.array([1, 2, 3, 4, 5])
new_arr = np.random.permutation(arr)
new_arr
輸出為:array([3, 1, 5, 4, 2])
。原陣列arr
不變。
5.2.2 shuffle
改變原有陣列為隨機排列。shuffle在英文中有洗牌的意思。
np.random.seed(99)
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
arr
輸出為:array([3, 1, 5, 4, 2])
。原陣列arr
改變。
5.3 隨機分佈
5.3.1 正太分佈
使用np.random.normal
方法生成符合正太分佈的隨機數。
x = np.random.normal(loc=1, scale=2, size=(2, 3))
x
輸出結果為:
array([[ 0.14998973, 3.22564777, 1.48094109],
[ 2.252752 , -1.64038195, 2.8590667 ]])
如果我們想檢視x的隨機分佈,需安裝seaborn繪製影像。使用pip安裝:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple seaborn
import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(x, hist=False)
plt.show()
5.3.2 二項分佈
使用np.random.binomial
方法生成符合二項分佈的隨機數。
x = np.random.binomial(n=10, p=0.5, size=10)
x
輸出結果為: array([8, 6, 6, 2, 5, 5, 5, 5, 3, 4])
。
繪製影像:
import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(x, hist=True, kde=False)
plt.show()
5.3.3 多項式分佈
多項式分佈是二項分佈的一般表示。使用np.random.multinomial
方法生成符合多項式分佈的隨機數。
x = np.random.multinomial(n=6, pvals=[1/6, 1/6, 1/6, 1/6, 1/6, 1/6])
x
上面程式碼,我們可以簡單理解為投擲骰子。n=6為骰子的面,pvals表示每一面的概率為1/6。
5.3.4 其他
除以上分佈外還有泊松分佈、均勻分佈、指數分佈、卡方分佈、帕累託分佈等。感興趣的可自行搜尋。
本文收錄於機器學習前置教程系列。歡迎大家點贊、收藏、關注,更多關於機器學習的精彩內容持續更新中……
相關文章
- 前置機器學習(五):30分鐘掌握常用Matplotlib用法機器學習
- 前置機器學習(四):一文掌握Pandas用法機器學習
- numpy 基礎入門 - 30分鐘學會numpy
- 30分鐘讓你掌握Git的黑魔法Git
- 【譯】三分鐘掌握 React 高階元件React元件
- 7分鐘用事例帶你掌握工作常用的 git 命令Git
- Python:一篇文章掌握Numpy的基本用法Python
- 5分鐘掌握JavaScript小技巧JavaScript
- 十分鐘掌握SQLite操作SQLite
- 30分鐘SQL指南SQL
- 五分鐘掌握 JavaScript 中的 IoCJavaScript
- 10分鐘掌握Python快取Python快取
- 30分鐘入門MyBatisMyBatis
- 30分鐘精通React HooksReactHook
- 30分鐘泛型教程泛型
- 30分鐘掌握ES6/ES2015核心內容(下)
- 三十分鐘掌握Webpack效能優化Web優化
- 5 分鐘掌握 JavaScript 實用竅門JavaScript
- 5分鐘掌握布隆過濾器過濾器
- 10分鐘掌握XML、JSON及其解析XMLJSON
- 機器學習(一):5分鐘理解機器學習並上手實踐機器學習
- 30分鐘快速瞭解webpackWeb
- 【譯】30 分鐘入門 TypescriptTypeScript
- 30分鐘理解GraphQL核心概念
- 30 分鐘 Qunit 入門教程
- 6分鐘瞭解所有機器學習模型機器學習模型
- 10分鐘掌握ConcurrentHashMap 3分鐘清楚和HashMap、Hashtable的區別HashMap
- 【機器學習】--Python機器學習庫之Numpy機器學習Python
- 1分鐘掌握 Python 函式引數Python函式
- 5分鐘掌握 webpack 多頁應用配置Web
- 掌握Mainframe系列之 10分鐘學習COBOLAI
- 一分鐘搞明白!快速掌握 Go WebAssemblyGoWeb
- 1分鐘掌握Arduino出入輸出口(I/O)UI
- NumPy常用操作
- 30 分鐘快速入門 Docker 教程Docker
- 30 分鐘理解 CORB 是什麼ORB
- 30 分鐘學會 Flex 佈局Flex
- 30 分鐘 Java Lambda 入門教程Java