Numpy使用入門
Jupyter
啟動
jupyter notebook
magic methed
執行外部python檔案 | %run /home/nanfengpo/Desktop/bb.py |
---|---|
執行計時 | %time statement 計算程式碼塊的執行時間 |
%timeit statement 計算程式碼執行的平均時間 | |
%%timeit statement1 statement2 計算多行程式碼的平均執行速度 | |
檢視當前會話中的所有變數和函式 | %who 檢視當前會話的所有變數和函式名稱 |
%whos 檢視當前會話的所有變數和函式名稱的詳細資訊 | |
%who_is 返回一個字串列表,裡面元素是當前會話的所有變數與函式名稱 | |
執行linux指令 | 在指令前 加 ! 例如 !ls |
更多魔法指令 | lsmagic 列出所有魔法指令 |
jupyter notebook 快捷鍵
enter | 進入編輯模式 |
---|---|
shift+enter | 執行本單元,選中下一單元 |
Y | 單元轉入程式碼狀態 |
M | 單元轉入Markdown狀態 |
A | 在上方插入新單元 |
B | 在下方插入新單元 |
Double-D | 刪除一行 |
ctrl+enter | 執行本單元 |
alt+enter | 執行本單元,在下面插入一個單元 |
Numpy
Numpy是python的一種開源的數值計算擴充套件
- 強大的N維陣列物件Array
- 豐富的函式庫
- 使用者整合C/C++和Fortran程式碼的工具包
- 使用的線性代數,傅立葉變換和隨機數生成函式
- numpy和係數矩陣運算包scipy配合使用更加強大
使用方法
建立陣列物件
- 使用np.array() 建立
建立一維array物件
import numpy as np
test = np.array([1,2,3,4,5])
test
輸出 array([1, 2, 3, 4, 5])
建立多維array物件
test = np.array([[1,2,3],[4,5,6]])
test
輸出 array([[1, 2, 3],
[4, 5, 6]])
使用np的常規函式建立
陣列物件內部引數固定為1
np.ones(shape, dtype=None, order='C')
引數shape是array陣列的樣式 dtype是陣列裡引數的型別 order='C'
np.ones([3,3])
輸出結果:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
np.ones([3,3],dtype=int)
輸出結果:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
自定義陣列物件內部引數
np.full(shape, fill_value, dtype=None, order='C')
fill_value 是陣列物件填充的引數
np.full([3,3],3.14)
輸出結果:
array([[ 3.14, 3.14, 3.14],
[ 3.14, 3.14, 3.14],
[ 3.14, 3.14, 3.14]])
對角線生成多維陣列物件
np.eye(N, M=None, k=0, dtype=float) k引數為便宜
np.eye(4,4)
輸出結果:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
np.eye(4,4,1)
輸出結果:
array([[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.],
[ 0., 0., 0., 0.]])
np.eye(4,4,-1)
輸出結果:
array([[ 0., 0., 0., 0.],
[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.]])
生成等差數列
(1)指定起始值,結束值,以及需要生成的個數 生成等差數列一維陣列
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start 起始值 stop 結束值 引數num 分成的份數
retstep 為True時 顯示步長 endpoint為True時 最後一個值是stop值
等差數列
np.linspace(0,10,5)
輸出結果:
array([ 0. , 2.5, 5. , 7.5, 10. ])
(2)指定起始值,結束值,以及步長 生成等差數列 一維陣列
np.arange([start, ]stop, [step, ]dtype=None)
等差數列
np.arange(0,10,2)
輸出結果:
array([0, 2, 4, 6, 8])
生成隨機數
(1)隨機整數一維陣列
np.random.randint(low, high=None, size=None, dtype='l')
size是生成的數量
np.random.randint(0,10,5)
輸出結果:
array([0, 7, 2, 3, 7])
(2)隨機數一維/多維陣列
np.random.randn(d0, d1, ..., dn)
#例子
np.random.randn(4,3,2)
輸出 從最後一個引數開始 2個數一組 3個組一列 最後 生成4個列
array([[[-0.75635231, 0.81645401],
[ 0.75044476, -0.45594693],
[ 1.18962227, -1.69061683]],
[[-1.35639905, -1.23243451],
[-0.54443916, -0.66817174],
[ 0.00731456, -0.61293874]],
[[ 1.29974807, -1.73309562],
[-0.9833101 , 0.35750775],
[-1.6135785 , 1.47071387]],
[[-1.1880176 , -0.54974619],
[-0.94004616, -0.82793236],
[ 0.10886347, 0.50780959]]])
np.random.randn(10)
# 每次每次都不一樣
輸出結果:
array([-1.74976547, 0.3426804 , 1.1530358 , -0.25243604, 0.98132079,
0.51421884, 0.22117967, -1.07004333, -0.18949583, 0.25500144])
np.random.seed(100)#隨機的種子,有了種子,每次都一樣
np.random.randn(10)
輸出結果:
array([ 0.37332715, -0.2887605 , 0.04985088, -0.93815832, -0.4087037 ,
1.13352254, 0.52713526, -0.76014192, -0.97292788, 0.16290446])
(3)隨機數一維陣列
np.random.random(size=None)
np.random.random(3)
array([0.73130075, 0.34038522, 0.0920556 ])
陣列的屬性
- ndim 維度
- shape 各個維度的長度
- size 總長度
- dtype 元素型別
陣列的操作
索引
np.random.seed(2)
# 隨機整數 5個一列 4列一組 生成3組
x = np.random.randint(10,size=[3,4,5])
# 取第3組第1列第1個
print(x[2,0,0])
print(x)
輸出
6
[[[8 8 6 2 8]
[7 2 1 5 4]
[4 5 7 3 6]
[4 3 7 6 1]]
[[3 5 8 4 6]
[3 9 2 0 4]
[2 4 1 7 8]
[2 9 8 7 1]]
[[6 8 5 9 9]
[9 3 0 0 2]
[8 8 2 9 6]
[5 6 6 6 3]]]
切片
一維與列表完全一致 多維時同理
np.random.seed(0)
x = np.random.randint(100,size = (10,4))
x
輸出結果:
array([[44, 47, 64, 67],
[67, 9, 83, 21],
[36, 87, 70, 88],
[88, 12, 58, 65],
[39, 87, 46, 88],
[81, 37, 25, 77],
[72, 9, 20, 80],
[69, 79, 47, 64],
[82, 99, 88, 49],
[29, 19, 19, 14]])
切片:
x[7:10]
切片結果:
array([[69, 79, 47, 64],
[82, 99, 88, 49],
[29, 19, 19, 14]])
變形
使用reshape函式,注意引數是一個tuple!
x = np.arange(0,16).reshape(4,4)
x
執行結果:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
型別是:
type(x.shape)
tuple
級聯
np.concatenate([x,x],axis = 0)
np.concatenate() 級聯需要注意的點:
級聯的引數是列表:一定要加中括號
維度必須相同
形狀相符
【重點】級聯的方向預設是shape這個tuple的第一個值所代表的維度方向
可通過axis引數改變級聯的方向np.concatenate() 級聯需要注意的點:
級聯的引數是列表:一定要加中括號
維度必須相同
形狀相符
【重點】級聯的方向預設是shape這個tuple的第一個值所代表的維度方向
可通過axis引數改變級聯的方向
x = np.array([1,2,3])
y = np.array([1,5,6,7,3,20])
x
輸出 array([1, 2, 3])
輸出 array([ 1, 5, 6, 7, 3, 20])
z = np.concatenate([x,y])
z
輸出 array([ 1, 2, 3, 1, 5, 6, 7, 3, 20])
z.shape
輸出 (9,)
/////////////////////////////////////////////////////
#二維
x = np.array([[1,2,3],[4,5,6]])
x
array([[1, 2, 3],
[4, 5, 6]])
x.shape
(2,3)
p = np.concatenate([x,x]).shape
p
(4, 3)
如果增加 axis 引數
個人理解:
加入有兩個 shape為 (4,3,2) 的陣列級聯操作
axis 為0 時 是 最外層的相加 也就4 這個級別
axis為1 時 是第二層的相加 也就是3這一層
axis為2時 是第三層的相加 就是2這一層
下面這個是例子 是 兩個 shape為 (2,3,3)的陣列的級聯操作
import numpy as np
x = np.array([[[1,2,3],[2,2,3],[3,3,3]],[[4,4,4],[5,5,5],[6,6,6]]])
print(x)
print(x.shape)
輸出:
[[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]
(2, 3, 3)
////////////////////////////////
w = np.concatenate([x,x],axis = 0)
print(w.shape)
print(w)
輸出:
(4, 3, 3)
[[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]
[[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]
////////////////////////////////////
w = np.concatenate([x,x],axis = 1)
print(w.shape)
print(w)
輸出:
(2, 6, 3)
[[[1 2 3]
[2 2 3]
[3 3 3]
[1 2 3]
[2 2 3]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]
[4 4 4]
[5 5 5]
[6 6 6]]]
/////////////////////////////////////
w = np.concatenate([x,x],axis = 2)
print(w.shape)
print(w)
輸出:
(2, 3, 6)
[[[1 2 3 1 2 3]
[2 2 3 2 2 3]
[3 3 3 3 3 3]]
[[4 4 4 4 4 4]
[5 5 5 5 5 5]
[6 6 6 6 6 6]]]
水平級聯和垂直級聯
np.hstack 水平級聯
np.vstack 垂直級聯
x = np.array([[1,1],[2,2],[3,3]])
y = np.array([1,2,3])
print(np.hstack(x))
print(np.vstack(y))
輸出:
[1 1 2 2 3 3]
[[1]
[2]
[3]]
切分
(1)np.split()
np.split(ary, indices_or_sections, axis=0)
x = np.arange(1,10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
x1,x2,x3 = np.split(x,[3,5]) #[3,5] 是索引位置
print(x1,x2,x3)
輸出:
[1 2 3] [4 5] [6 7 8 9]
___________________________
x1,x2,x3,x4 = np.split(x,[1,4,6])
print(x1,x2,x3,x4)
輸出:
[1] [2 3 4] [5 6] [7 8 9]
____________________________
x = np.arange(3,10)
x
輸出: array([3, 4, 5, 6, 7, 8, 9])
x1,x2,x3,x4 = np.split(x,[1,3,5])
print(x1,x2,x3,x4)
輸出:[3] [4 5] [6 7] [8 9]
(2)np.hsplit()
垂直切分
x = np.arange(16).reshape(4,4)
x
輸出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
print(np.hsplit(x,[2,3]))
# [2,3] 是切的位置 2 為 0,1 |4,5| 8,9 | 12,13
# 3為 2 6 10 14
輸出:
[array([[ 0, 1],[ 4, 5], [ 8, 9], [12, 13]]),
array([[ 2], [ 6], [10], [14]]),
array([[ 3], [ 7], [11], [15]])]
(3)np.vsplit()
橫切
x = np.arange(16).reshape(4,4)
x
輸出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
# 橫切 把 1,2 兩行 切到一組 第3行切為一組 剩餘的為一組
print(np.vsplit(x,[2,3]))
輸出:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
副本
所有賦值運算不會為ndarray的任何元素建立副本。對賦值後的物件的操作也對原來的物件生效
a = np.array([1,2,3])
b=a
print(a,b)
輸出:
[1 2 3] [1 2 3]
b[0]=2
a
輸出:
array([2, 2, 3])
可使用copy()函式建立副本
a = np.array([1,2,3])
b = a.copy()
b
輸出:
[1,2,3]
b[0]=3
print(a,b)
輸出:
[1 2 3] [3 2 3]
聚合操作
- 求和np.sum()
x = np.arange(4)
np.sum(x)
輸出 6
- 最大最小值:np.max/ np.min
- 求平均值 np.mean(heights)
- 計算標準差 heights.std()
矩陣操作
- 基本操作 加減乘除
a = np.array([[1,2,3],
[4,5,6]])
a
輸出:
array([[1, 2, 3],
[4, 5, 6]])
a+1
輸出:
array([[2, 3, 4],
[5, 6, 7]])
a*2
輸出:
array([[ 2, 4, 6],
[ 8, 10, 12]])
a+[[1,4,9],[3,3,3]]
輸出:
array([[ 2, 6, 12],
[ 7, 8, 9]])
a*2-2
輸出:
array([[ 0, 2, 4],
[ 6, 8, 10]])
-
矩陣積
A*B
A的橫排去乘B的豎排 按順序去乘即可
廣播機制
【重要】ndarray廣播機制的兩條規則
規則一:為缺失的維度補1
規則二:假定缺失元素用已有值填充
例子
a = np.ones((4,1))
a
輸出:
array([[1.],
[1.],
[1.],
[1.]])
b = np.arange(4)
b
輸出:
array([0, 1, 2, 3])
a + b
a 實際上變成了
array([[1.,1,1,1],
[1.,1,1,1],
[1.,1,1,1],
[1.,1,1,1]])
這個就是規則1 給缺失的維度補1
而b變成了
array([[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]])
這個就是規則2 假定缺失元素用已有值填充
因此 a+b的值 輸出為
array([[1., 2., 3., 4.],
[1., 2., 3., 4.],
[1., 2., 3., 4.],
[1., 2., 3., 4.]])
排序
- 快速排序
np.sort()與ndarray.sort()都可以,但有區別:
np.sort()不改變輸入
ndarray.sort()本地處理,不佔用空間,但改變輸入
- 部分排序
np.partition(a,k) #引數1是陣列 引數2是要的個數
當k為正數時 要最小的k個 數 這幾個數在陣列前k個
當k為負數時 要最大的k個 數 這幾個數在陣列後k個
有的時候我們不是對全部資料感興趣,我們可能只對最小或最大的一部分感興趣。
當k為正時,我們想要得到最小的k個數
當k為負時,我們想要得到最大的k個數
相關文章
- numpy入門指南
- Python人工智慧常用庫Numpy使用入門Python人工智慧
- numpy 基礎入門 - 30分鐘學會numpy
- Python中的Numpy入門教程Python
- 清晰易懂的Numpy入門教程
- NumPy從入門到放棄
- NumPy之:使用genfromtxt匯入資料
- 帶你入門比Python更高效的Numpy(附程式碼)Python
- Android入門教程 | RecyclerView使用入門AndroidView
- influxdb使用入門UX
- IPFS 使用入門
- lucene入門使用
- PromiseKit 入門使用Promise
- PyAutoGUI使用入門GUI
- Jetty使用入門Jetty
- plantuml使用入門
- CentOS使用入門CentOS
- appuploader 入門使用APP
- Redis 入門使用Redis
- valgrind使用入門
- JNA使用入門
- milvus入門使用
- postman 使用入門Postman
- Docker使用入門Docker
- Mysql - 使用入門MySql
- AWS Lambda 使用入門
- 01 | Bootstrap使用入門boot
- mongoose的入門使用Go
- PostgreSQL JSONB 使用入門SQLJSON
- React入門到使用React
- Redux入門到使用Redux
- arthas的使用入門
- Metricbeat入門與使用
- Android WorkManager使用入門Android
- github ations 入門使用Github
- promise入門基本使用Promise
- React Hook 入門使用ReactHook
- Elasticsearch(windows)使用入門ElasticsearchWindows