Numpy:array的建立和ndarray的基本操作
Numpy
匯入:import numpy as np
1.建立陣列
一維陣列的建立
arr1=np.array([1,2,3,4,5],float)二維陣列的建立
arr2=np.array([[1,2,3],[3,4,5],[1,5,8]])
注意:
如果傳進來的列表中包含不同的型別,則統一為統一型別,str>float>int
2.使用np的routines函式建立
np.ones([3,3])
輸出結果:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])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(4)
eye()返回一個對角線為1的矩陣
輸出結果:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])等差數列(此處num=5)
np.linspace(0,10,5)
輸出結果:
array([ 0. , 2.5, 5. , 7.5, 10. ])等差數列(此處step=2)
np.arange(0,10,2)
輸出結果:
array([0, 2, 4, 6, 8])隨機整數
np.random.randint(0,10,5)
輸出結果:
array([0, 7, 2, 3, 7])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])random.random()預設0-1,左開右閉
np.random.seed(3)#時間種子,將時間固定,產生固定不變的隨機數
np.random.random(size=[2,2])
輸出結果:
array([[0.5507979 , 0.70814782],
[0.29090474, 0.51082761]])
3.ndarray的屬性
4個必記引數:
- ndim:維度
- shape:形狀
- size:總長度
- dtype:元素型別
注意:dtype返回陣列元素的型別,type()函式返回陣列型別
4.索引
一維與列表完全一致 多維時同理
arr=np.random.randint(10,50,size=(3,4))
arr
a
array([[19, 46, 25, 10],
[38, 35, 39, 39],
[18, 19, 10, 46]])
arr[1][2]
39
5.切片
用以上例子中的a:
a[0:2] 獲取前兩行
a[0:2,0:2] 獲取前兩行前兩列
a[:,0:2] 獲取前兩列
a[::-1] 行倒序
a[:,::-1] 列倒序
a[::-1,::-1] 行、列全部倒序
6.變形
arr=np.random.randint(1,100,size=(100,))
將一個一維陣列arr變成多維陣列
arr.reshape((10,10)) #兩個引數分別是新陣列的行和列
將多維陣列變成一維陣列
a.reshape(12) #12是陣列長度
arr.reshape(-1,10)
-1:手動指定列數,自動計算行數
7.級聯
np.concatenate() 級聯需要注意的點:
- 級聯的引數是列表:一定要加中括號
- 維度必須相同
- 形狀相符
- axis引數:0表示縱向級聯,1表示橫向級聯;axis的範圍由陣列維度決定0-(維度-1)
np.hstack與np.vstack 水平級聯與垂直級聯
8.切分
- np.spilt()
x = np.arange(1,10)
x
輸出:
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
x1,x2,x3 = np.split(x,[3,5])
print(x1,x2,x3)
輸出:
[1 2 3] [4 5] [6 7 8 9]
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])) 輸出: [array([[ 0, 1],[ 4, 5], [ 8, 9], [12, 13]]), array([[ 2], [ 6], [10], [14]]), array([[ 3], [ 7], [11], [15]])]
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]]) 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]])]
9.副本
所有賦值運算不會為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]
10.使用matplotlib.pyplot獲取一個數組,資料來源於一張圖片
import matplotlib.pyplot as plt
img=plt.imread('C:/Users/jiaxinyi/Desktop/a4coho1467042412050.jpg')
img.shape #得到的陣列形狀
輸出:
(650,1200,3)