????????NumPy(Numerical Python)是 Python 生態中用于科學計算的核心庫,提供高性能的多維數組對象(ndarray
)及相關的數學運算工具。其核心功能圍繞數組操作、線性代數、隨機數生成等,是數據科學、機器學習等領域的基礎依賴。
numpy核心數據類型
????????NumPy 的核心是?ndarray
(N-dimensional array),一種高效存儲和操作多維數據的容器。與 Python 原生列表相比,ndarray
?支持矢量化運算,避免循環,顯著提升性能。
- 特性:
- 固定大小,創建后不可變(元素可修改)。
- 所有元素類型相同(
dtype
?指定)。 - 支持廣播(Broadcasting)機制實現不同形狀數組的運算。
numpy安裝
????????這個我們可以直接在命令行窗口或者終端進行pip install numpy就行了,但是可能會比較慢,我們這里加上清華的鏡像源
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
創建一個ndarray對象
1 直接創建
import numpy as npa=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13])
print(type(a))
這樣我們就創建了一個數組(如果我們想創建一個多維數組對象,我們直接傳入一個多維數組就行了),我們還查看了一下,我們創建了一個什么類型的數據,結果輸出<class 'numpy.ndarray'>,這樣我們就要記得,numpy創建的數據類型為<class 'numpy.ndarray'>
2 用可迭代對象arrang創建
import numpy as np
r1 = np.arange(0,9,3)
print(r1)
這里我們創建了一個一維的數組對象,可迭代對象內容為?[0 3 6]
3 用linspace創建
import numpy as np
r2 = np.linspace(0,1,5)
print(r2)
?先給出結果[0. ? 0.25 0.5 ?0.75 1. ?]
從結果可以看出,有三個參數,前兩個為區間的左右兩頭數值,最后一個表示個數,要注意這個數組內容都是浮點型的,對于arrange相比,這個左右區間都是閉的。
4 創建特殊數組
import numpy as np
a=np.zeros(3)
print('一維:\n',a)
b=np.zeros((3,3))
print('二維:\n',b)
c=np.zeros((3,3,3))
print('三維:\n',c)
輸出結果:
?這里我們創建了幾個全0矩陣,以為我們只能傳入一個參數。那么我們要傳入幾個參數的術后,我們要傳入一個數組,數組中幾個數表示幾位的。大小就是數組的那樣n*n*n的,同樣全一數組也是這樣的,用np.ones()就不展示了。
5 full()創建矩陣
import numpy as np
a=np.full((3,3),6)
print(a)
輸出結果:
我們可以看到,full可以提供兩個參數,一個來控制矩陣的維度大小,另有一個控制填充值。
6 創建單位矩陣
import numpy as np
a=np.eye(5,5)
print(a)
?輸出
這里我們輸出了一個矩陣,對角線全一,如果列和行不相同,那么就從左一開始為一,大家可以試下。
另外我們可以通過對我們創建的這個多維數組對象進行查看
我們可以看到這里有許多方法 ,其中包含許多方法,例如reshape,dot,copy,ndim等等,下面我們來說些常用的
numpy常用操作
1 查看矩陣基本數據類型
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print('矩陣形狀',a.shape)
print('矩陣維度',a.ndim)
print('矩陣大小',a.size)
print('矩陣儲存位置',a.data)
print('每個矩陣數據存儲所占位置',a.itemsize)
輸出結果
2 基本運算
import numpy as np
array1 = np.array([[1,2],[3,4]])
array2 = array1 * 2print(array1 + array2) # 加法
print(array1 - array2) # 減法
print(array1 * array2) # 乘法
print(array1 / array2) # 除法
print(array2 % array1) # 取余
print(array1 // array2) # 取整
輸出結果?
3 reshape方法
這個既可以升維度也可以降維度。
import numpy as np
a=np.array([1,2,3,4,5,6,7,8])
b=a.reshape(2,4)
c=a.reshape(2,-1)
print(a)
print(b)
print(c)
?這里我展示了兩種修改數據形狀的方法,一種給出確定的大小,然后就可以轉化到自己想要的了,還有一種給出一個確定的,剩下可以讓機器自己算,注意這里要可以整除,不然會報錯。
我們這里還要注意,a.reshape(2,4)是又創建了一個副本,并不是對原來的數據進行修改,如果要對原本數據進行修改,我們要對他進行賦值例如a=a.reshape(2,4).
4 resize()方法
import numpy as np
a=np.array([[1,2,3,4,5,6,7,8],[1,2,3,4,5,6,7,8]])
b=a.resize(2,2)
print(a)
print(b)
輸出
resize是一個可以調整矩陣大小的方法。可以調整到自己指定的大小。這里調整后的數據是從第一行開始取,作為我們調整后的數據。
注意!這里a.resize(2,2)是一個None值,說明我們調整的是a原本數據
5 repeat
import numpy as np
a=np.array([1,2,3])
c=a.repeat(3)
print(c)
?輸出
這個是將矩陣中每個值x參數個,不是數值x而是x個數。
6 選取
???????????????????????????????????????
import numpy as np
a=np.array([[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24]])
print(a[1:3,2:8])
結果
我們可以根據矩陣進行想列表中切片那樣,進行選取,拿第一個參數表示第一維為例,如果是[0:3]就表示從第一行到第二行的全選中了,[1:]表示第二行以及后面的。后面參數也是這樣。
7 flatten()
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=a.flatten()
print(b)
#c = a.ravel() 有相同的作用
輸出
這個函數就相當于np.reshape(-1),revel也可以,但是flatten用到最多就是把矩陣展開變成一維的
8 矩陣的基本運算
點乘
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(np.dot(a,[[2,2,2],[2,2,2],[2,2,2]]))
print(a.dot([[2,2,2],[2,2,2],[2,2,2]]))
輸出?
這里我用了兩種點乘的方法,輸出結果一樣。這里是矩陣與矩陣之間的相乘。
這里還有點需要注意的是,矩陣直接直接相乘是a*b,點乘是dot(a,b),矩陣直接相乘也可以a*2這樣可以直接將矩陣的數值擴大二倍。
轉置
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=a.T
print(a)
print(b)
輸出直接用a.T來實現,這里也是生成了一個副本不是對源數據進行修改?
求逆
這里是求偽逆,不管這個矩陣有沒有可逆,都可以求所以我們要驗證下
import numpy as np
a=[[1,2],[3,4]]
b=np.linalg.inv(a)
print(b)
print(np.dot(a,b))
輸出
?9 連接
import numpy as np# 生成基數組
array1 = np.array([[1,2,3],[4,5,6]])
array2 = np.array([[7,8,9],[10,11,12]])# 水平組合(沿列方向拼接)
a3 = np.hstack((array1, array2)) # 水平拼接array1和array2
a4 = np.hstack((array2, array1)) # 水平拼接array2和array1
a5 = np.hstack((array1, array2, array1)) # 三數組水平拼接
a6 = np.concatenate((array1, array2), axis=1) # 等價于vstack
print(a3)
print(a4)
print(a5)# 垂直組合(沿行方向拼接)
a7 = np.vstack((array2, array1)) # 垂直拼接array2和array1
print(a6)# 通用連接函數(axis=0為垂直方向)
a8 = np.concatenate((array1, array2), axis=0) # 與vstack效果相同
print(a8)
輸出???????
上面我們采用了三種方法,分別是三種方法一種垂直方向,一種水平方向,還有給用concatenate來實現。可以參照對應輸出來看。