整理一下自己學習的筆記 也希望可以幫助到正在學習機器學習的人
這篇程式是在Jupyter Notebook 上執行編譯的
創建 Numpy.array 的方法
import numpy as np
創建0矩陣
|
|
結果
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
創建的數值 默認是浮點數
|
|
結果
dtype(‘float64’)
建立10個整數
|
|
結果
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
也可以傳入二維
|
|
結果
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
第一個參數他是名子的 也可以這樣寫
|
|
結果
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
獲得全1的向量
|
|
結果
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
當然這也可以傳入二維
|
|
結果
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
傳入指定值 傳入555 是 整型 要浮點型 要輸入555.0
|
|
加入參數名 這邊fill_value 可以傳變數名稱 也可以不傳 加入變數名稱 維護會比較容易一些
|
|
傳入的這兩個值 可以交換
|
|
結果
array([[555, 555, 555, 555, 555],
[555, 555, 555, 555, 555],
[555, 555, 555, 555, 555]])
arange
用生成表達式的方式建立 第一個參數=起始點 第二個參數=中止點 第三個參數=補償(不填默認唯1)
結果不包刮20 python 的range 是不可以傳浮點數的
|
|
結果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
numpy 的arange 可以傳浮點數 第三個參數=補償 (預設值也是1)
|
|
結果
array([0. , 0.2, 0.4, 0.6, 0.8])
只傳一個參數的話 起始值預設 是0
|
|
結果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
linspace
參數與arange 一樣 第三個值不是補償
( 這邊是0 - 20 的區間裡等長的擷出10個點 這邊10個點是包含 0 和20 )
0 是起始點 20是終止點 中間8個值 與起始點 終止點 形成等差數列 他們的間距是相等的
|
|
結果
array([ 0. , 2.22222222, 4.44444444, 6.66666667, 8.88888889,
11.11111111, 13.33333333, 15.55555556, 17.77777778, 20. ])
如果要以2為補償使用linspace的話
|
|
結果
array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20.])
random
生成0 - 9的隨機數
(區間是0-10 但這隨機數是取不到10的)
|
|
結果
9
生成 0 - 9 隨機數的向量
|
|
結果
array([9, 0, 9, 8, 2, 5, 7, 8, 4, 3])
生成 0 - 9 隨機數二維矩陣
(第三個參數 可以給他一個名稱會比較好閱讀))
|
|
結果
array([[8, 0, 3, 0, 1],
[7, 6, 4, 6, 8],
[7, 1, 3, 1, 2]])
讓隨機數產生一致
如果機器學習算法中要驗證這些隨機的向量 或是隨機的矩陣
但是每次取的值都是不一致的 這會沒辦法驗證
隨機數通常都是偉隨機數 都會有一個key
|
|
這樣子生成 生成的都會是一致的
結果
array([[7, 1, 1, 8, 7],
[1, 1, 5, 9, 2],
[2, 3, 6, 8, 7]])
生成隨機的浮點數 (是在0 - 1 之間分布的值)
如果不輸入值 默認會產生一個
|
|
結果
array([0.31647204, 0.36173317, 0.45072243, 0.91526806, 0.45995858,
0.27367946, 0.91749612, 0.45953222, 0.54459121, 0.69069037])
也可以生成一個二維0 - 1 之間的隨機浮點數
|
|
結果
array([[0.83083808, 0.63590931, 0.64981717, 0.95375833, 0.56995437],
[0.6352015 , 0.03646224, 0.74912676, 0.85806843, 0.48540734],
[0.23216177, 0.50338804, 0.13613189, 0.1730703 , 0.10495834]])
產生符合正態分佈的浮點數 符合均值為0 方差為1分佈的隨機浮點數
|
|
結果
0.7543888054016835
指定 均值 方差
(指定均值為10 方差為100 分佈的隨機數)
|
|
結果
114.58354338987674
也可以指定他的大小
(均值為0 方差為1 3*5的隨機矩陣)
|
|
結果
array([[-0.23283302, 0.20643376, 0.3993155 , 1.46962845, -0.86042417],
[ 0.90035145, -0.34036856, 0.59739536, -0.40102587, -1.59174938],
[-0.56669195, 0.33081722, 0.58673318, 0.18174824, 0.87216409]])
Numpy.array 基本操作
import numpy as np
先建立一個一維的數組 與二維數組 接下來會使用到
|
|
結果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
二維數組
|
|
結果
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
###基本屬性###
查看幾維的數組
|
|
結果
1
|
|
結果
2
shape 返回是一個原組
|
|
結果
(10,)
|
|
結果
(3, 5)
size 元素個數
|
|
結果
10
|
|
結果
15
###Unmpy.array資料訪問###
x 值 = array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
X 值 = array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
|
|
結果
0
|
|
結果
9
python 寫法
|
|
結果
0
建議使用Numpy的方式 後面會到為什麼
|
|
結果
12
使用欺騙方法 從0開始一直到5不包含5
|
|
結果
array([0, 1, 2, 3, 4])
如果:前面不輸入值的話 就是從頭一直訪問到第5元素
|
|
結果
array([0, 1, 2, 3, 4])
如果:後面不輸入值得話 就是從第5個元素訪問到最後
|
|
結果
array([0, 1, 2, 3, 4])
可傳入第三個參數 第三個參數=補償 如果前面兩個不填寫
就是從頭訪問到尾 每次補償為2
|
|
結果
array([0, 2, 4, 6, 8])
補償也可以傳入-1 代表從倒數的訪問方式
|
|
結果
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])X 值 = array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
如果想要得到前兩行的前三列
|
|
結果
array([[0, 1, 2],
[5, 6, 7]])
如果使用python 的兩個[]來取值的話
來看一下會發生什麼事
|
|
結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
|
|
結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])[:2]結果與 [:2][:3] 一樣的
[:2]代表取X這個數組的前兩個元素 也就是前兩行的內容
[:2][:3]這邊的[:3] python 在解析的時候是取
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
的前三元素 但這個數組裡面只有兩個元素
最終的結果依然是這兩個元素
[][]來搜尋數組的時候會沒辦法表達我們的語意的情況所以真正表達取 前兩行的前三列的話 必須使用[:2,:3]
使用Numpy的話 一維數組 也盡量使用[2,2]這種表達式
訪問前兩行 每一行從頭到尾 但是間隔為2數組
|
|
結果
array([[0, 2, 4],
[5, 7, 9]])
訪問行從最後一行到第一行 到著數 列也是從最後一列到著數
|
|
結果
array([[14, 13, 12, 11, 10],
[ 9, 8, 7, 6, 5],
[ 4, 3, 2, 1, 0]])
矩陣降維處理 只取第一行
|
|
結果
array([0, 1, 2, 3, 4])
也可以用二維的表達方式
|
|
結果
array([0, 1, 2, 3, 4])
這樣會變成一維的向量
|
|
結果
1
要取一列的話 :代表取全部的行 列的維度上只取0 只看第一列
|
|
結果
array([ 0, 5, 10])
這樣得到也是一維的數組
|
|
結果
1
子矩陣
|
|
結果
array([[0, 1, 2],
[5, 6, 7]])
如果將subX 將其中的值修改
|
|
結果
array([[100, 1, 2],
[ 5, 6, 7]])
但X原矩陣 有沒有被改變?
在python 使用這種方式 是建立一個新的矩陣
subX 與 原本的X 是沒有關係的
但是在Numpy不是這樣的
在Numpy為了效率的關係 所以他會影響到原矩陣
如果修改原矩陣的元素 subX子矩陣也會跟著更改
|
|
結果
array([[100, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14]])
COPY
要用Numpy建立一個 與子矩陣沒關係的元素的話 要使用.copy
|
|
結果
array([[100, 1, 2],
[ 5, 6, 7]])
subX 0 0 修改值
|
|
結果
array([[0, 1, 2],
[5, 6, 7]])
|
|
結果
array([[100, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14]])
###Reshape ###
x 值 = array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
如果要將這10個值 變成2 * 5的矩陣
|
|
結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
####使用reshape 是沒有改變x 本身的####
|
|
結果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
如果要將改變的存起來的話 需要給他新的值
|
|
結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
如果要將 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 變成二維數組
|
|
結果 是有兩個[][]
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
|
|
結果
2
|
|
結果
(1 , 10)
如果想要10行 有多少 不管列有多少
|
|
結果
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
也可以 我想要有5列 不管它有多少行
|
|
結果
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
合併操作
如果只需要合併兩個的話也可以傳兩個進去就好
|
|
結果
array([ 1, 2, 3, 3, 2, 1, 555, 555, 55])
二維矩陣也可以合併
|
|
結果
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
沿著列的方向合併
|
|
結果
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
二維與一維合併
|
|
結果
array([[ 1, 2, 3],
[ 4, 5, 6],
[555, 555, 55]])
這樣A還是原來的值
|
|
結果
array([[1, 2, 3],
[4, 5, 6]])
如果想要保存起來需要賦上一個新的值
|
|
結果
array([[ 1, 2, 3],
[ 4, 5, 6],
[555, 555, 55]])
如果使用concatenate 又要加上reshape 覺得太麻煩的話
可以使用vstack 可以直接二維與一維合併
|
|
結果
array([[100, 100],
[100, 100]])
|
|
結果
array([[ 1, 2, 3, 100, 100],
[ 4, 5, 6, 100, 100]])
分割
|
|
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
split 傳入兩個參數 (切割三段)
第一個參數分割的數組
第二個參數分割點
|
|
x1 0-3 不包含3
array([0, 1, 2])
x2 3 , 7 中間的內容
array([3, 4, 5, 6])
X3 7到結尾的內容
array([7, 8, 9])
####split (切割兩段)####
|
|
x2
array([0, 1, 2, 3, 4])
x3
array([5, 6, 7, 8, 9])
二維
|
|
結果
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
分成兩部分
|
|
A1
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
A2
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
####列的方向分割 axis 默認=0####
|
|
A1
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
A2
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
####也可用vsplit 垂直方向分割####
A垂直的方向 以2這個點作為分割點 進行分割
|
|
upper
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
lower
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
hvsplit 水平方向分割
|
|
left
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
right
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
如果前面三個代表三個特徵 最後一個代表目標值
將特徵矩陣 與目標值向量 分割
|
|
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
|
|
x
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]])
y
array([[ 3],
[ 7],
[11],
[15]])
很多時候希望目標值 是個向量
|
|
array([ 3, 7, 11, 15])