numpy模組

以下命令都是在瀏覽器中輸入。
cmd命令視窗輸入:jupyter notebook
後開啟瀏覽器輸入網址http://localhost:8888/

一、匯入模組

import numpy as np

檢視numpy版本

np.__version__

Numpy可以提供陣列支援以及相應的高效處理函式,是Python資料分析的基礎,也是SciPy、Pandas等資料處理和科學計算庫最基本的函式功能庫,且其資料型別對Python資料分析十分有用。

二、建立陣列(ndarray)

1. 使用np.array()

引數為列表: 如[1, 4, 2, 5, 3]

arr1=np.array([1,2,3,4])
arr1    #點選shift + Enter後可直接檢視陣列
1.1 檢視變數的資料型別
type(arr1)
輸出:numpy.ndarray
1.2 建立二維陣列
arr2= np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2
1.3 建立多維陣列

如建立三維陣列:

arry3=np.array([[[1,2,3],[4,5,6],[7,8,9]]])
arry3
1.4 注意
  • numpy預設ndarray的所有元素的型別是相同的
  • 如果傳進來的列表中包含不同的型別,則統一為同一型別,優先順序:str>float>int

如:

np.array([1,2,'a'])
輸出:array(['1', '2', 'a'], 
      dtype='<U11')
  • shape的使用:shape返回的是ndarray的陣列形狀(返回型別是元組)。返回值的資料個數表示的就是陣列的維度
arr2.shape
輸出:(3, 3)  #意思是arr2是一個3行3列的陣列
2、使用matplotlib.pyplot獲取一個numpy陣列,資料來源於一張圖片
2.1、匯入模組
import matplotlib.pyplot as plt
2.2 讀取圖片
img=plt.imread(r'./虎.jpg')  #img此時就是numpy.ndarray
img.shape  
輸出:(369, 389, 3)  #img形狀為三維陣列,369*389畫素,3代表顏色維度
type(img)
輸出:numpy.ndarray
2.3顯示圖片
plt.imshow(img)
plt.show()
2.4修改圖片
img_ecg=img-50   #img-50意思是每個元素減去50,陣列值改變,圖片自然會改變
plt.imshow(img_ecg)
plt.show()
3、使用numpy的常見函式建立

包含以下常見建立方法:

3.1 np.ones(shape, dtype=None, order=’C’)
#建立22列的全部數值都為1的二維陣列
arr= np.ones(shape=(2,2),dtype=int) 
arr
輸出:array([[1, 1],
       [1, 1]])
3.2 np.zeros(shape, dtype=None, order=’C’)
#建立23列的全部數值都為0的二維陣列
arr=np.zeros([2,3])
arr
輸出:array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
3.3 np.full(shape, fill_value, dtype=None, order=’C’)
#建立23列的全部數值都為10的二維陣列
#fill_value引數為陣列填充的值
arr=np.full(shape=(2,4),fill_value=10,dtype=int)
arr
輸出:array([[10, 10, 10, 10],
       [10, 10, 10, 10]])
3.4 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差數列
#陣列初值為0,有10個值,終值為9
arr_linspace=np.linspace(start=0,stop=10,num=10,endpoint=False)
arr_linspace
輸出:array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
3.5 np.arange([start, ]stop, [step, ]dtype=None)
##陣列初值為0,有5(10除以2)個值,終值為8,只能建立一維陣列
arr_arange=np.arange(0,10,2)
arr_arange
輸出:array([0, 2, 4, 6, 8])
3.6 np.random.randint(low, high=None, size=None, dtype=’l’)
#建立一個隨機數在[10,90)的3行4列二維陣列
#size=[3]則是一個一維陣列,size=[3,4,5]則是三維陣列
#隨機原理:根據當前系統的時間產生隨機數
#可以固定種子,使用seed(種子)函式
#np.random.seed(1) 
np.random.randint(10,90,size=[3,4])
3.7 np.random.randn(d0, d1, …, dn) 標準正太分佈
#建立一個10個元素的一維陣列
np.random.randn(10)
#建立一個多維陣列
#如建立10行,10列的陣列
np.random.randn((10,10))
3.8 np.random.random(size=None)

生成[0,1)的隨機數

#建立一個2行2列的數值在[0,1)的二維陣列
np.random.random(size=[2,2])
3.9 np.random.rand(d0,d1,…dn )

以給定的形狀建立一個數組,並在陣列中加入在[0,1)之間均勻分佈的隨機樣本。

np.random.rand(10)

這裡寫圖片描述

np.random.rand(2,2)

這裡寫圖片描述

3.10 np.eye(N, M=None, k=0, dtype=float)

#建立一個對角線為1的矩陣(二維陣列)
arr_eys=np.eye(4)
arr_eys
輸出:
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

三、ndarray的屬性

4個必記引數:

ndim:維度

shape:形狀(各維度的長度)

size:總長度

dtype:元素型別

arr_eys.ndim
輸出:2
arr_eys.shape 
輸出:(4, 4)  #4行4列的二維陣列
arr_eys.size
輸出:16
arr_eys.dtype
輸出:dtype('float64')
type(arr_eys)
輸出:numpy.ndarray

四、ndarray的基本操作

1、 索引

通過下標來獲取元素。一維與列表完全一致 多維時同理 。

np.random.seed(10)
arr=np.random.randint(10,50,size=(3,4))
arr
輸出:
array([[19, 46, 25, 10],
       [38, 35, 39, 39],
       [18, 19, 10, 46]])
#索引
arr[1][2]
輸出:39

也根據索引修改資料 。

2 、切片
2.1 一個冒號:進行切片

通過冒號來切片,通過逗號來區分維度。一維與列表完全一致 多維時同理 。

#獲取前兩行資料
arr[0:2]
輸出:
array([[19, 46, 25, 10],
       [38, 35, 39, 39]])
#獲取前兩行的前兩列資料
arr[0:2,0:2]
輸出:
array([[19, 46],
       [38, 35]])

逗號左邊切的是第一個維度(行),逗號右邊切的是第二個維度(列)

#獲取二維陣列前兩列資料
arr[:,0:2]
輸出:
array([[19, 46],
       [38, 35],
       [18, 19]])
2.2 兩個冒號::進行切片

一維

將資料反轉,例如[1,2,3]—->[3,2,1

#建立一維陣列
arr=np.arange(0,10)
arr
輸出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#反轉
arr[::-1]
輸出:
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

二維

#建立一個33列的二維陣列
arr=np.linspace(0,9,num=9,endpoint=False).reshape((3,3))
arr
輸出:
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.]])
#將陣列的行倒序
arr[::-1]
輸出:
array([[ 6.,  7.,  8.],
       [ 3.,  4.,  5.],
       [ 0.,  1.,  2.]])
#將陣列的列倒序
arr[:,::-1]
輸出:
array([[ 2.,  1.,  0.],
       [ 5.,  4.,  3.],
       [ 8.,  7.,  6.]])
#全倒置
arr[::-1,::-1]
輸出:
array([[ 8.,  7.,  6.],
       [ 5.,  4.,  3.],
       [ 2.,  1.,  0.]])
3、 圖片倒置

讀取圖片

import matplotlib.pyplot as plt
img=plt.imread(r'./虎.jpg')
type(img)
輸出:
numpy.ndarray
#顯示圖片
plt.imshow(img)
plt.show()

這裡寫圖片描述

左右倒置圖片

img_lr=img[::,::-1]
plt.imshow(img_lr)
plt.show()

這裡寫圖片描述

上下倒置圖片

img_ab=img[::-1]
plt.imshow(img_ab)
plt.show()

這裡寫圖片描述

全倒置圖片

img_all=img[::-1,::-1]
plt.imshow(img_all)
plt.show()

這裡寫圖片描述

4、變形

使用arr.reshape()函式,注意引數是一個tuple(元組)!

  • 基本使用
4.1 將一維陣列變形成多維陣列
#建立一個隨機數在[1,800)的10個元素的一維陣列
arr=np.random.randint(1,800,size=(10,))
arr.shape
輸出:(10,)
#將一維陣列變形成2行5列的二維陣列
arr2=arr.reshape((2,5))
arr2.shape
輸出:
(2, 5)

使用-1自動計算行數(或列數)

#將一維陣列變形成2行5列的二維陣列
arr2=arr.reshape((-1,5))
arr2.shape
輸出:
(2, 5)
#將一維陣列變形成2行5列的二維陣列
arr2=arr.reshape((2,-1))
arr2.shape
輸出:
(2, 5)
4.2 將多維陣列變形成一維陣列
#將arr2變形成一維陣列
arr3=arr2.reshape(10)
arr3.shape
輸出:(10,)

使用-1自動計算元素個數

arr=arr2.reshape(-1)
arr.shape
輸出:(10,)
5、級聯
  • np.concatenate()
5.1、一維,二維,多維陣列的級聯

一維

a1=np.array([1,2,3])
np.concatenate([a1,a1])
輸出:
array([1, 2, 3, 1, 2, 3])
#建立兩個二維陣列
a1=np.random.randint(0,100,size=(3,4))
a2=np.random.randint(0,100,size=(3,4))

二維

#建立兩個二維陣列
a1=np.random.randint(0,100,size=(3,4))
a2=np.random.randint(0,100,size=(3,4))
a1
輸出:
array([[18, 53, 32, 84],
       [93, 28, 41, 26],
       [30, 20, 47,  6]])
a2
輸出:
array([[14, 35, 15, 73],
       [90, 16, 58, 51],
       [69, 41,  4, 60]])

列跟列連在一起

#axis=0表示縱向(列跟列連線在一起)級聯
np.concatenate([a1,a2],axis=0) 
輸出:
array([[18, 53, 32, 84],
       [93, 28, 41, 26],
       [30, 20, 47,  6],
       [14, 35, 15, 73],
       [90, 16, 58, 51],
       [69, 41,  4, 60]])

行與行連線在一起

#axis=1表示橫向(行跟行連線在一起)級聯
np.concatenate([a1,a2],axis=1) 
輸出:
array([[18, 53, 32, 84, 14, 35, 15, 73],
       [93, 28, 41, 26, 90, 16, 58, 51],
       [30, 20, 47,  6, 69, 41,  4, 60]])

axis引數的取值範圍:取值範圍是由級聯的陣列維度決定的 (0-(維度-1))

級聯需要注意的點:

  • 級聯的引數是列表:一定要加中括號或小括號
  • 維度必須相同
  • 形狀相符:在維度保持一致的前提下,如果進行橫向(axis=1)級聯,必須保證進行級聯的陣列行數保持一致。如果進行縱向(axis=0)級聯,必須保證進行級聯的陣列列數保持一致。
  • 可通過axis引數改變級聯的方向
5.2 np.hstack與np.vstack

水平級聯與垂直級聯,代替axis引數。

np.hstack((a1,a2))
輸出:
array([[18, 53, 32, 84, 14, 35, 15, 73],
       [93, 28, 41, 26, 90, 16, 58, 51],
       [30, 20, 47,  6, 69, 41,  4, 60]])
np.vstack((a1,a2))
輸出:
array([[18, 53, 32, 84],
       [93, 28, 41, 26],
       [30, 20, 47,  6],
       [14, 35, 15, 73],
       [90, 16, 58, 51],
       [69, 41,  4, 60]])
6、 合併照片
img=plt.imread(r'./虎.jpg')
img.shape
輸出:
(738, 389, 3)
plt.imshow(img)
plt.show()

這裡寫圖片描述

#上下合併
img_v=np.concatenate((img,img),axis=0)
img_v.shape
輸出:
(738, 389, 3)
plt.imshow(img_v)
plt.show()

這裡寫圖片描述

#左右合併
img_h=np.concatenate((img,img),axis=1)
img_h.shape
輸出:
(369, 778, 3)
plt.imshow(img_h)
plt.show()

這裡寫圖片描述

7、 切分

與級聯類似,三個函式完成切分工作:

  • np.split(arr,行/列號,軸):引數2是一個列表型別
  • np.vsplit(arr,行/列號) 水平切
  • np.hsplit(arr,行/列號) 垂直切
  • 返回值是一個列表
arr=np.array([[3,2,4],[9,5,8],[2,7,1]])
arr
輸出:
array([[3, 2, 4],
       [9, 5, 8],
       [2, 7, 1]])

np.split()

#切分第12列(下標從0開始),切兩刀,返回一個列表
np.split(arr,[1,2],axis=1)   
輸出:
[array([[3],
        [9],
        [2]]), array([[2],
        [5],
        [7]]), array([[4],
        [8],
        [1]])]

np.vsplit()

#切分第1行(下標從0開始),切一刀,返回一個列表
np.vsplit(arr,[1])
輸出:
[array([[3, 2, 4]]), array([[9, 5, 8],
        [2, 7, 1]])]

np.hsplit()

#切分第1列(下標從0開始),切一刀,返回一個列表
np.hsplit(arr,[1])
輸出:
[array([[3],
        [9],
        [2]]), array([[2, 4],
        [5, 8],
        [7, 1]])]
8、 切分照片
#axis=0,水平切
img=plt.imread(r'./虎.jpg')
img.shape
輸出:
(369, 389, 3)
img_list=np.split(img,[170],axis=0)
plt.imshow(img_list[0])
plt.show()

這裡寫圖片描述

9、 副本

所有賦值運算不會為ndarray的任何元素建立副本。對賦值後的物件的操作也對原來的物件生效。

a=np.array([1,2,3,4,5])
a1=a
a[1]=222
a
輸出:
array([  1, 222,   3,   4,   5])
a1
輸出:
array([  1, 222,   3,   4,   5])

可使用copy()函式建立副本

a=np.array([1,2,3,4,5])
a1=a.copy()
a[1]=222
a
輸出:
array([  1, 222,   3,   4,   5])
a1
輸出:
array([1, 2, 3, 4, 5])
10、 ravel() 陣列扁平化

方式1:np.ravel(a,order=’C’)

方式2:ndarray.racel(order=’C’)

把多維陣列扁平化成一維陣列。引數’C’表示按行進行扁平,’F’表示按列進行扁平。

#建立二維陣列
arr1=np.array([[1,2],[3,4]])
arr1

這裡寫圖片描述

arr1.ravel(order='C')

這裡寫圖片描述

arr1.ravel(order='F')

這裡寫圖片描述

np.ravel(arr1)

這裡寫圖片描述

np.ravel(arr1,order='F')

這裡寫圖片描述

11、np.c_[arr1,arr2,…] 數組合並

把多個數組合併成一個數組。

arr1=np.array([1,2,3,4])
arr1
結果為:
array([1, 2, 3, 4])
np.c_[arr1,arr1]
結果為:
array([[1, 1],
       [2, 2],
       [3, 3],
       [4, 4]])

多維陣列:

#建立三維陣列
arr2=np.array([[[1,2,3],[4,5,6],[7,8,9]]])
arr2
結果為:
array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]])
np.c_[arr2,arr2,arr2]
結果為:
array([[[1, 2, 3, 1, 2, 3, 1, 2, 3],
        [4, 5, 6, 4, 5, 6, 4, 5, 6],
        [7, 8, 9, 7, 8, 9, 7, 8, 9]]])
12、獲取陣列不重複的值

np.unique(ar,return_counts=False)

引數ar:陣列

引數return_counts:返回每個元素出現的次數

返回值是一個 元組。

arr=np.array([11,1,2,3,4,11,3,5])
np.unique(arr,return_counts=True)

這裡寫圖片描述

13、使用dispkay()顯示多個數組
#匯入包
from IPython.display import display
a=np.array([1,2,3,4])
b=np.array([5,6,7])
display(a,b)

這裡寫圖片描述

五、ndarray的聚合操作

1、 求和np.sum

一維

arr=np.linspace(0,10,10,endpoint=False)
arr
輸出:
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
np.sum(arr,axis=0)
輸出:
45.0

二維

np.random.seed(8)
arr2=np.random.randint(0,10,size=(3,4))
arr2
輸出:
array([[3, 4, 1, 9],
       [5, 8, 3, 8],
       [0, 5, 1, 3]])

axis=0,列相加

np.sum(arr2,axis=0)
輸出:
array([ 8, 17,  5, 20])

axis=1,行相加

np.sum(arr2,axis=1)
輸出:
array([17, 24,  9])
2、 最大最小值:np.max/ np.min
np.random.seed(8)
arr2=np.random.randint(0,10,size=(3,4))
arr2
輸出:
array([[3, 4, 1, 9],
       [5, 8, 3, 8],
       [0, 5, 1, 3]])

axis=0,列最小值

np.min(arr2,axis=0)
輸出:
array([0, 4, 1, 3])

axis=1,行最小值

np.min(arr2,axis=1)
輸出:
array([1, 3, 0])
3、 平均值:np.mean()
arr2=np.array([[1,2,3],[3,4,5]])
arr2
輸出:
array([[1, 2, 3],
       [3, 4, 5]])

axis=0,列平均值

np.mean(arr2,axis=0)
輸出:
array([ 2.,  3.,  4.])

axis=1,行平均值

np.mean(arr2,axis=1)
輸出:
array([ 2.,  4.])
4、 其他聚合操作
Function Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements
np.prod    np.nanprod    Compute product of elements
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.var    np.nanvar    Compute variance
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin    np.nanargmin    Find index of minimum value
np.argmax    np.nanargmax    Find index of maximum value
np.median    np.nanmedian    Compute median of elements
np.percentile    np.nanpercentile    Compute rank-based statistics of elements
np.any    N/A    Evaluate whether any elements are true
np.all    N/A    Evaluate whether all elements are true
np.power 冪運算

六、ndarray的矩陣操作

1、 基本矩陣操作
1.1算術運算子:
  • 加減乘除
#建立一個33列的二維陣列x1
x1 = np.arange(9.0).reshape((3, 3))
x1
輸出:
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.]])
#建立一個3個元素的一維陣列x2
x2 = np.arange(3.0)
x2
輸出:
array([ 0.,  1.,  2.])

x1+x2

x1+x2
輸出:
array([[  0.,   2.,   4.],
       [  3.,   5.,   7.],
       [  6.,   8.,  10.]])

x2會自動補全成

array([[ 0., 1., 2.],
[ 0., 1., 2.],
[ 0., 1., 2.]])

再和x1相加,對應的元素相加。【廣播機制】

1.2 矩陣積np.dot()

兩個集合中,a的行數和b的列數必須保持一致

這裡寫圖片描述

arr1=np.array([[1,2],[3,4]])
arr1
輸出:
array([[1, 2],
       [2, 3]])
arr2=np.array([[5,6],[7,8]])
arr2
輸出:
array([[5, 6],
       [7, 8]])
np.dot(arr1,arr2)
輸出:
array([[19, 22],
       [31, 36]])
1.3 逆矩陣

函式np.linalg.inv()
矩陣相乘:行和列相同,行乘列。

#導包
import numpy as np
from IPython.display import display
# 建立兩個二維陣列
a = np.random.randint(0,10,size = (2,3))

b = np.random.randint(0,10,size = (3,4))
display(a,b)

這裡寫圖片描述

#矩陣點乘:行乘列:8*0+4*8+4*4 = 48
np.dot(a,b)

這裡寫圖片描述

#單元矩陣:a_T*a
unit_a = np.dot(a_T,a)
# 逆矩陣的求解:
nverse_matrix = np.linalg.inv(unit_a)
nverse_matrix

這裡寫圖片描述

2、廣播機制

【重要】ndarray廣播機制的三條規則:缺失維度的陣列將維度補充為進行運算的陣列的維度。缺失的陣列元素使用已有元素進行補充。

  • 規則一:為缺失的維度補1(進行運算的兩個陣列之間的維度只能相差一個維度)
  • 規則二:缺失元素用已有值填充
  • 規則三:缺失維度的陣列只能有一行或者一列

例1: m = np.ones((2, 3)) a = np.arange(3) 求m+a

m=np.ones((2,3))
a=np.arange(3)
m
輸出:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
a
輸出:
array([0, 1, 2])
m+a
輸出:
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])

七、ndarray的排序

1、快速排序
1.1 np.sort()不改變輸入
1.2 ndarray.sort()本地處理,不佔用空間,但改變輸入
np.random.seed(3)
arr=np.random.randint(0,10,size=(3,4))
arr
輸出:
array([[8, 9, 3, 8],
       [8, 0, 5, 3],
       [9, 9, 5, 7]])
#預設排序,對行進行從小到大的排序,引數axis預設為-1
np.sort(arr) 
輸出:
array([[3, 8, 8, 9],
       [0, 3, 5, 8],
       [5, 7, 9, 9]])
#np.sort(arr)不改變arr,arr和原來一樣
arr
輸出:
array([[8, 9, 3, 8],
       [8, 0, 5, 3],
       [9, 9, 5, 7]])
#axis=0,按列進行排序
np.sort(arr,axis=0)
輸出:
array([[8, 0, 3, 3],
       [8, 9, 5, 7],
       [9, 9, 5, 8]])
#按行進行排序
np.sort(arr,axis=1)
輸出:
array([[3, 8, 8, 9],
       [0, 3, 5, 8],
       [5, 7, 9, 9]])

arr.sort()會改變arr

#有一個引數axis,預設為-1,按行排序
arr.sort()
arr
輸出:
array([[3, 8, 8, 9],
       [0, 3, 5, 8],
       [5, 7, 9, 9]])
2、部分排序

np.partition(a,k)

有的時候我們不是對全部資料感興趣,我們可能只對最小或最大的一部分感興趣。

  • 當k為正時,我們想要得到最小的k個數
  • 當k為負時,我們想要得到最大的k個數
np.random.seed(3)
arr=np.random.randint(0,10,size=(3,4))
arr
輸出:
array([[8, 9, 3, 8],
       [8, 0, 5, 3],
       [9, 9, 5, 7]])
np.partition(arr,-3)
輸出:
array([[3, 8, 9, 8],
       [0, 3, 5, 8],
       [5, 7, 9, 9]])