機(jī)器學(xué)習(xí)利器之Numpy

Numpy
多維數(shù)組

PS:機(jī)器學(xué)習(xí)相關(guān)代碼:https://nbviewer.jupyter.org/github/coderzc/machine_learning/tree/master/jupyter
GitHub源碼:https://github.com/coderzc/machine_learning
等有時(shí)間整理一下,發(fā)出來

Numpy 創(chuàng)建N維數(shù)組

import numpy as np

''' 創(chuàng)建10行10列的數(shù)值為浮點(diǎn)0的矩陣 '''
>>> print("np.zeros\n", np.zeros([10, 10]))
np.zeros
 [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

''' 創(chuàng)建10行10列的數(shù)值為浮點(diǎn)1的矩陣 '''
>>> print("np.ones\n", np.ones([10, 10]))
np.ones
 [[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]


''' 創(chuàng)建10行10列的數(shù)值為浮點(diǎn)1的對(duì)角矩陣 '''
>>> print("np.eye\n", np.eye(10, 10))
np.eye
 [[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]

''' 從數(shù)值范圍創(chuàng)建數(shù)組 開始,結(jié)束,步長,輸出元素類型 '''
>>> print("np.arange\n", np.arange(0, 100, 2, float))
np.arange
 [ 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.]

'''生產(chǎn)隨機(jī)數(shù)組 5行5列 范圍0~1'''
>>> np.random.rand(5, 5)
array([[0.79909192, 0.40687012, 0.05833267, 0.90631693, 0.85774438],
       [0.65685319, 0.99620959, 0.64195711, 0.28694344, 0.54805126],
       [0.87347445, 0.20443748, 0.45883044, 0.90017425, 0.17487183],
       [0.4833086 , 0.59498315, 0.75053456, 0.93725983, 0.79870607],
       [0.8908418 , 0.49860926, 0.44097606, 0.53744394, 0.21089092]])


''' 生成在半開半閉區(qū)間 [low,high)上離散均勻分布的整數(shù)值;若high=None,則取值區(qū)間變?yōu)閇0,low) ; size維度 '''
>>> np.random.randint(4,10,size=(5, 5))
array([[6, 6, 6, 7, 9],
       [4, 8, 6, 7, 7],
       [6, 8, 6, 5, 7],
       [7, 8, 8, 4, 5],
       [7, 6, 5, 5, 7]])


''' 給定均值/標(biāo)準(zhǔn)差/維度的正態(tài)分布 '''
>>> np.random.normal(1.75, 0.1, (3, 4))
array([[1.83246388, 1.73186179, 1.78198763, 1.76844117],
       [1.69089184, 1.69620751, 1.78018062, 1.68086896],
       [1.86462936, 1.61972878, 1.95645574, 1.66104741]])


''' 將列表轉(zhuǎn)換為np數(shù)組 '''
>>> array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> np_array = np.array(array, dtype=float)  # copy,新數(shù)組
>>> print("np.array:\n", np_array)
np.array:
 [[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 9. 10. 11. 12.]]

>>> np_array2 = np.asarray(array, dtype=float)  # view,會(huì)改變原數(shù)組
>>> print("np.asarray:\n", np_array2)
np.asarray:
 [[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 9. 10. 11. 12.]]

查看數(shù)組屬性

# 數(shù)組元素個(gè)數(shù)
>>> print("數(shù)組元素個(gè)數(shù) size:", np_array.size)
數(shù)組元素個(gè)數(shù) size: 12
# 數(shù)組形狀
>>> print("數(shù)組形狀 shape:", np_array.shape)
數(shù)組形狀 shape: (3, 4)
# 數(shù)組維度
>>> print("數(shù)組維度 ndim:", np_array.ndim)
數(shù)組維度 ndim: 2
# 數(shù)組元素類型
>>> print("數(shù)組元素類型 dtype:", np_array.dtype)
數(shù)組元素類型 dtype: float64
# 數(shù)組中每個(gè)元素的字節(jié)大小
>>> print("數(shù)組元素類型 itemsize:", np_array.itemsize)
數(shù)組元素類型 itemsize: 8

shape操作

>>> array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> n1 = np.asarray(array)

# 改變數(shù)組的格式
>>> n2 = n1.reshape(6, 2)
>>> print(n1)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
>>> print(n2)
[[ 1  2]
 [ 3  4]
 [ 5  6]
 [ 7  8]
 [ 9 10]
 [11 12]]

# 將多維降到1維展開
>>> print("flatten():", n2.flatten())  # copy,新數(shù)組
flatten(): [ 1  2  3  4  5  6  7  8  9 10 11 12]
>>> print("ravel():", n2.ravel())  # view,會(huì)改變原數(shù)組,卻不會(huì)改變shape
ravel(): [ 1  2  3  4  5  6  7  8  9 10 11 12]

# 轉(zhuǎn)置
>>> n3 = np.arange(12)
>>> n3 = n3.reshape(3, 4)
>>> print("n3:", n3)
n3: [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

>>> print("n3.T:", n3.T)
n3.T: [[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]

# reshape一些特殊值
>>> n4 = np.arange(10, 130, 10)
>>> print("n4:", n4.reshape(4, 3))
n4: [[ 10  20  30]
 [ 40  50  60]
 [ 70  80  90]
 [100 110 120]]

#   -1 一維展開 與 ravel()作用相似
>>> print(n4.reshape(-1))
[ 10  20  30  40  50  60  70  80  90 100 110 120]

#   (-1,1) n行,1列
>>> print(n4.reshape(-1, 1))
[[ 10]
 [ 20]
 [ 30]
 [ 40]
 [ 50]
 [ 60]
 [ 70]
 [ 80]
 [ 90]
 [100]
 [110]
 [120]]

#   (1,-1) 1行,n列但任然是二維矩陣
>>> print(n4.reshape(1, -1))
[[ 10  20  30  40  50  60  70  80  90 100 110 120]]

數(shù)組索引和迭代

>>> print('\n\n')
>>> n5 = np.arange(30)
>>> print('n5:', n5)
n5: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29]

# 獲取第一個(gè)元素
>>> print(n5[0])
0

# 獲取倒數(shù)第一個(gè)元素
>>> print(n5[-1])
29

# 取前十個(gè)數(shù)
>>> print(n5[:10])
[0 1 2 3 4 5 6 7 8 9]

# 取后十個(gè)數(shù)
>>> print(n5[-10:])
[20 21 22 23 24 25 26 27 28 29]

# 取前11-20個(gè)數(shù),左閉右開
>>> print(n5[10:20])
[10 11 12 13 14 15 16 17 18 19]

# 前十個(gè)數(shù)中,每2個(gè)數(shù)取一個(gè)
>>> print(n5[:10:2])
[0 2 4 6 8]

# 第6-15個(gè)數(shù)中,每3個(gè)數(shù)取一個(gè)
>>> print(n5[5:15:3])
[ 5  8 11 14]

# 所有的數(shù)中,每10個(gè)數(shù)取一個(gè)
>>> print(n5[::10])
[ 0 10 20]

# 什么都不寫,可以原樣復(fù)制一個(gè)數(shù)組
>>> print(n5[:])
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29]


############### 多維數(shù)組索引與切片 ###############
>>> n6 = n5.reshape(5, 6)
>>> print('n6:', n6)
n6: [[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]]

#   索引第二行第三列的元素
>>> print('n6[1, 2]:', n6[1, 2])
n6[1, 2]: 8

#   在第一維取前兩行,第二維每+2取一個(gè)元素
>>> print('n6[:2, ::2]:\n', n6[:2, ::2])
n6[:2, ::2]:
 [[ 0  2  4]
 [ 6  8 10]]

# 取第一列
>>> print('n6[:, 0]]:\n', n6[:, 0])
n6[:, 0]]:
 [ 0  6 12 18 24]

# 取第2、3列
>>> print('n6[:, 3:5]]:\n', n6[:, 3:5])
n6[:, 3:5]]:
 [[ 3  4]
 [ 9 10]
 [15 16]
 [21 22]
 [27 28]]

拼接、分割

>>> A=np.arange(10,20).reshape(5,2)
>>> print(A)
[[10 11]
 [12 13]
 [14 15]
 [16 17]
 [18 19]]

>>> B=np.arange(20,30).reshape(5,2)
>>> print(B)
[[20 21]
 [22 23]
 [24 25]
 [26 27]
 [28 29]]

# 垂直拼接
>>> C=np.vstack([A,B]) #C=np.r_[A,B]
>>> print(C)
[[10 11]
 [12 13]
 [14 15]
 [16 17]
 [18 19]
 [20 21]
 [22 23]
 [24 25]
 [26 27]
 [28 29]]

# 自我堆疊
>>> v=np.asarray([1,2])
>>> a=np.vstack([v]*2)
>>> print(a)
[[1 2]
 [1 2]]
# 橫向堆疊兩次,縱向堆疊一次
>>> b=np.tile(v,(2,1))
>>> print(b)
[[1 2]
 [1 2]]

# 水平拼接
>>> C=np.hstack([A,B]) #C=np.c_[A,B]
>>> print(C)
[[10 11 20 21]
 [12 13 22 23]
 [14 15 24 25]
 [16 17 26 27]
 [18 19 28 29]]

#列組合column_stack([A,B]) 一維數(shù)組:按列方向組合  二維數(shù)組:同hstack一樣
>>> A=np.arange(10,20)
>>> print(A)
[10 11 12 13 14 15 16 17 18 19]
#行組合row_stack([A,B]) 一維數(shù)組:按行方向組合  二維數(shù)組:同vstack一樣

基礎(chǔ)運(yùn)算

>>> n7 = np.asarray([10, 20, 30,40])
>>> n8 = np.arange(4)
>>> print(n7)
[10 20 30 40]
>>> print(n8)
[0 1 2 3]

# 計(jì)算立方
>>> print(n7**3)
[ 1000  8000 27000 64000]

# 三角函數(shù)
>>> print(np.sin(n7))
[-0.54402111  0.91294525 -0.98803162  0.74511316]

# 指定軸最大/小值
>>> print(np.amax(n7, axis=0))
40
>>> print(np.amin(n7, axis=0))
10

# 平均值
>>> print(np.mean(n7, axis=0))
25.0

# 中位數(shù)
>>> print(np.median(n7))
25.0

# 方差
>>> print(n7.var())
125.0

# 標(biāo)準(zhǔn)差
>>> print(np.std(n7, axis=0))
11.180339887498949

# 差值
>>> print("n7-n8:",n7-n8)
n7-n8: [10 19 28 37]


# 逐個(gè)相乘非矩陣乘法
>>> n9 = np.asarray([[1,1],[0,1]])
>>> print(n9)
[[1 1]
 [0 1]]
>>> n10=np.arange(4).reshape((2,2))
>>> print(n10)
[[0 1]
 [2 3]]
>>> print(n9 * n10) 
[[0 1]
 [0 3]]

矩陣計(jì)算

# Ax=B 求解x
>>> A = np.array([[2, 1, -2], [3, 0, 1], [1, 1, -1]])
>>> B = np.transpose(np.array([[-3, 5, -2]]))
>>> x = np.linalg.solve(A, B)
>>> print('x:\n', x)
x:
 [[ 1.]
 [-1.]
 [ 2.]]

# 矩陣相乘 C=AB  求解C
>>> A = np.array([[3, 2, -2], [3, 1, 4], [3, 1, -2]])
>>> B = np.arange(9).reshape((3,3))
>>> C = np.dot(A, B)
>>> print('C:\n',C)
C:
 [[-6 -3  0]
 [27 35 43]
 [-9 -7 -5]]


# 矩陣乘向量
>>> v=np.asarray([1,2])
>>> print(v)
[1 2]
>>> A=np.arange(1,5).reshape(2,2)
>>> print(A)
[[1 2]
 [3 4]]
>>> D=v.dot(A)
>>> print(D)
[ 7 10]
# 自動(dòng)將v轉(zhuǎn)換為列向量,結(jié)果有自動(dòng)轉(zhuǎn)化為行向量
>>> C=A.dot(v)
>>> print(C)
[ 5 11]


# 矩陣的逆
>>> A=np.arange(1,5).reshape(2,2)
>>> print(A)
[[1 2]
 [3 4]]
>>> invA=np.linalg.inv(A)
>>> print(invA)
[[-2.   1. ]
 [ 1.5 -0.5]]
#   矩陣乘以矩陣的逆等于單位矩陣對(duì)角線都為1,其他為0,這里有浮點(diǎn)誤差
>>> print(A.dot(invA))
[[1.00000000e+00 1.11022302e-16]
 [0.00000000e+00 1.00000000e+00]]

# 對(duì)于非方陣求偽逆矩陣
>>> A=np.arange(1,11).reshape(2,5)
>>> print(A)
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
>>> pinvA=np.linalg.pinv(A)
>>> print(pinvA)
[[-0.36  0.16]
 [-0.2   0.1 ]
 [-0.04  0.04]
 [ 0.12 -0.02]
 [ 0.28 -0.08]]
>>> print(A.dot(pinvA))
[[ 1.00000000e+00 -1.11022302e-16]
 [-8.88178420e-16  1.00000000e+00]]

排序與arg

>>> x=np.asarray([2,6,7,1,4,5,8,3,10,9])
>>> print(x)
[ 2  6  7  1  4  5  8  3 10  9]

# argxxx 索引函數(shù)
>>> print(np.argmax(x)) #最大數(shù)的索引為8
8
>>> print(np.argmin(x))
3

# 排序
>>> print(np.sort(x))
[ 1  2  3  4  5  6  7  8  9 10]

# x原地排序
>>> x.sort()
>>> print(x)
[ 1  2  3  4  5  6  7  8  9 10]

#打亂順序
>>> np.random.shuffle(x)
>>> print(x)
[ 9  3  5  6  2  1  8  4  7 10]

# 返回排序索引
>>> print(np.argsort(x))
[5 4 1 7 2 3 8 6 0 9]

# 劃分大于3和小于3 (快排子過程)
>>> print(np.partition(x,3))
[ 2  1  3  4  5  6  8  7  9 10]

FancyIndexing與np比較

>>> x=np.arange(16)
>>> print(x)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]

# FancyIndexing
>>> a=[3,5,8]
>>> print(x[a])
[3 5 8]

# np數(shù)組比較
>>> x<3
array([ True,  True,  True, False, False, False, False, False, False,
       False, False, False, False, False, False, False])

>>> 2*x==24-4*x
array([False, False, False, False,  True, False, False, False, False,
       False, False, False, False, False, False, False])

# 小于等于3的元素Ture/False序列
>>> i=(x<=3)
>>> print(i)
[ True  True  True  True False False False False False False False False
 False False False False]
>>> print(x[i])
[0 1 2 3]
>>> np.sum(i) # 對(duì)值Ture累加記數(shù)
4

# 是否含有零元素
>>> np.any(x==0)
True

# 是否都等于零
>>> np.all(x==0)
False

# 判斷兩個(gè)數(shù)組是否相等
>>> np.all(x==x)
True

讀取數(shù)據(jù)

>>> np.genfromtxt("http://aima.cs.berkeley.edu/data/iris.csv", delimiter=",",skip_header=0,dtype="f8,f8,f,i4,|S8")
array([(5.1, 3.5, 1.4, 0, b'setosa'), (4.9, 3. , 1.4, 0, b'setosa'),
       (4.7, 3.2, 1.3, 0, b'setosa'), (4.6, 3.1, 1.5, 0, b'setosa'),
       (5. , 3.6, 1.4, 0, b'setosa'), (5.4, 3.9, 1.7, 0, b'setosa'),
       (4.6, 3.4, 1.4, 0, b'setosa'), (5. , 3.4, 1.5, 0, b'setosa'),
       (4.4, 2.9, 1.4, 0, b'setosa'), (4.9, 3.1, 1.5, 0, b'setosa'),
       (5.4, 3.7, 1.5, 0, b'setosa'), (4.8, 3.4, 1.6, 0, b'setosa'),
  ......
  ......
       (5.8, 2.7, 5.1, 1, b'virginic'), (6.8, 3.2, 5.9, 2, b'virginic'),
       (6.7, 3.3, 5.7, 2, b'virginic'), (6.7, 3. , 5.2, 2, b'virginic'),
       (6.3, 2.5, 5. , 1, b'virginic'), (6.5, 3. , 5.2, 2, b'virginic'),
       (6.2, 3.4, 5.4, 2, b'virginic'), (5.9, 3. , 5.1, 1, b'virginic')],
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<i4'), ('f4', 'S8')])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 numpy是支持 Python語言的數(shù)值計(jì)算擴(kuò)充庫,其擁有強(qiáng)大的高維度數(shù)組處理與矩陣運(yùn)算能力。除此之外,nu...
    開發(fā)者也閱讀 3,383評(píng)論 0 35
  • Numpy的組成與功能 Numpy(Numeric Python)可以被理解為一個(gè)用python實(shí)現(xiàn)的科學(xué)計(jì)算包,...
    不做大哥好多年閱讀 4,555評(píng)論 0 10
  • 基礎(chǔ)篇NumPy的主要對(duì)象是同種元素的多維數(shù)組。這是一個(gè)所有的元素都是一種類型、通過一個(gè)正整數(shù)元組索引的元素表格(...
    oyan99閱讀 5,286評(píng)論 0 18
  • 一、numpy概述 numpy(Numerical Python)提供了python對(duì)多維數(shù)組對(duì)象的支持:ndar...
    L_steven的貓閱讀 3,602評(píng)論 1 24
  • 1、一種作風(fēng)在初盛時(shí),大半都有不可磨滅的優(yōu)點(diǎn),但后來聞風(fēng)響應(yīng)者往往得其形似而失其精神。比如此前在青年中興起的一股文...
    鄧嘉豪閱讀 282評(píng)論 0 0

友情鏈接更多精彩內(nèi)容