NumPy
是Python中科學計算的基礎包。它是一個Python庫,提供多元數組對象,各種派生對象(如掩碼數組和矩陣),以及用于數組快速操作的各種例程,包括數學,邏輯,形狀操作,排序,選擇,I / O離散傅立葉變換,基本線性代數,基本統計運算,随機模拟等等。
NumPy包的核心是ndarray對象。這封裝了同構資料類型的n維數組,許多操作在編譯代碼中執行以提高性能。NumPy數組和标準Python序列之間有幾個重要的差別:
- NumPy數組在建立時具有固定大小,與Python清單(可以動态增長)不同。更改ndarray的大小将建立一個新數組并删除原始數組。
- NumPy數組中的元素都需要具有相同的資料類型,是以在記憶體中的大小相同。例外:可以有(Python,包括NumPy)對象的數組,進而允許不同大小的元素的數組。
- NumPy數組有助于對大量資料進行進階數學和其他類型的操作。通常,與使用Python的内置序列相比,這些操作的執行效率更高,代碼更少。
- 越來越多的基于Python的科學和數學軟體包正在使用NumPy數組; 雖然這些通常支援Python序列輸入,但它們在處理之前将這些輸入轉換為NumPy數組,并且它們通常輸出NumPy數組。換句話說,為了有效地使用當今大量(甚至大多數)基于Python的科學/數學軟體,隻知道如何使用Python的内置序列類型是不夠的
- 還需要知道如何使用NumPy數組。
下面是我對于一些Numpy常用方法的總結:
1.導入Numpy包,給它重命名為np
import numpy as np
2.讀取TXT檔案,調用np.genfromtxt()方法,第一個參數為檔案位址,delimiter= ','表示以 ‘,’ 為分隔符來切分檔案。 dtypr表示将讀取的檔案輸出為字元格式。

world_alcohol = np.genfromtxt('world_alcohol.txt',delimiter=',',dtype=str)
print(type(world_alcohol))
print(world_alcohol)
print(help(np.genfromtxt))
3.調用array()方法生成一個一維相量,相當于将一個清單放在array()中,但array()中隻能是同類型的資料。
vector = np.array([5,10,15,20])
vector
4.當改變一個資料的類型時,其他資料也會跟着改變
numbers = np.array([1,2,3,4.0])
print(numbers)
print(numbers.dtype)
5.調用array()方法生成一個二維矩陣,相當于将一個二維清單放在array()中
matrix = np.array([[5,10,15],
[20,25,30],
[35,40,45]])
matrix
6.shape()方法比較常用,用來顯示一個array數組是幾行幾列的,常用于debug
print(vector.shape)
print(matrix.shape)
7.通過索引提取資料,行和列的索引都是從0開始 (skip_header=1 跳過原資料的第一行,從第二行開始顯示)
world_alcohol = np.genfromtxt('world_alcohol.txt',delimiter=',',dtype=str,skip_header=1)
world_alcohol
8.切片索引,左閉右開
vector = np.array([5,10,15,20]) #提取某一行資料
print(vector[0:3])
matrix = np.array([ #提取某一列資料
[5,10,15],
[20,25,30],
[35,40,45]
])
print(matrix[:,1])
print(matrix[:,0:2]) #提取某兩列
9.Numpy計算,判斷array數組是否等于某個值,結果傳回值為布爾值(True/False)
vector = np.array([5,10,15,20])
print(vector)
print(vector == 10)
matrix = np.array([
[5,10,15],
[20,25,30],
[35,40,45]
])
print(matrix == 25)
10.将判斷後的布爾值當作索引來提取資料
second_column_25 = (matrix == 25)
print(second_column_25)
print(matrix[second_column_25])
#将判斷後的布爾值當作索引找出這個資料所在位置,并提取出該資料所在#的這一行資料
data_second_hang = (matrix[:,1] == 25)
print(data_second_hang)
print(matrix[data_second_hang,:])
11.比較運算中的與(&)、或(|)、非
#與(&),一個數不可能同時等于5和10
vector = np.array([5,10,15,20])
equal_to_ten = (vector == 10) & (vector == 5)
print(equal_to_ten)
#或(|)
equal_to_ten2 = (vector == 10) | (vector == 5)
print(equal_to_ten2)
#通過比較找出傳回的布爾值為True的值并給他指派
equal_to_ten3 = (vector == 10) | (vector == 5)
vector[equal_to_ten3] = 50
print(vector)
12.給array中的資料轉換資料類型,使用astype()方法,括号内寫要改變成的資料類型。
vector2 = np.array(["1","2","3"])
print(vector2.dtype)
print(vector2)
vector2 = vector2.astype(float) #資料類型改變
print(vector2.dtype)
print(vector2)
13.求極值
#極小值和極大值
vector = np.array([5,10,15,20])
print(vector.min())
print(vector.max())
#求某一行或某一列的和,axis=1 表示行,axis=0 表示列
matrix = np.array([[5,10,15],
[20,25,30],
[35,40,45]])
print(matrix.sum(axis=1)) #按行求和
matrix = np.array([[5,10,15],
[20,25,30],
[35,40,45]])
matrix.sum(axis=0) #按列求和
14.矩陣變換
np.arange(x) 生成[0,15]的一個相量,左包右閉
np.arange(x).reshape(a,b) 将之前生成的相量變換成a行b列的矩陣
print(np.arange(15))
a = np.arange(15).reshape(3,5) #15=3*5
print(a)
print(a.shape)
print(a.ndim) #傳回目前矩陣的維數
print(a.dtype.name) #傳回矩陣的資料類型
print(a.size) #傳回矩陣中的元素個數
15.矩陣的初始化
#zeros()方法中必須要傳入元組,否則會出錯,其初始化全部指派0
np.zeros((3,4))
np.ones((2,3,4),dtype=np.int32) #ones()方法初始化指派全為1
np.arange(10,30,5)#調用機關函數構造的矩陣從5開始30結束,以5為步進
16.numpy中的随機子產品
np.random.random((2,3)) #調用兩次random,第一次先進random子產品,
#第二次再調用random函數,随機數的範圍[-1,1]
17.linspace(x,y,z)方法從某個區間上得到z個數,這z個數從區間[x,y]中平均去取,區間左包右包
from numpy import pi
np.linspace(0,2*pi,100)
18.numpy矩陣做數學運算
a = np.array([20,30,40,50])
b = np.arange(4)
print(a)
print(b)
#矩陣相加減,是兩個矩陣相同的行和列兩數進行加減
c = a + b
d = a - b
print(c)
print(d)
print(b**2) #求平方
19.矩陣乘積
A*B 表示矩陣A和矩陣B相同行和列的資料相乘,矩陣的大小不變
A.dot(B)和np.dot(A,B) 表示矩陣A和B進行矩陣乘法,即一行乘以一列
A = np.array([[1,1],
[0,1]])
B = np.array([[2,0],
[3,4]])
print(A)
print('-------')
print(B)
print(A*B)
print(A.dot(B))
print('-------')
print(np.dot(A,B))
20. np.exp(x) 求e的x次幂
np.sqrt(x) 求根号x
np.floor() 向下取整,就是去最接近目前值的最大整數,例如3.14向下取整為3 ravel() 将矩陣變換成一個相量
a = np.array([20,30,40,50])
C = np.arange(3)
print(C)
print(np.exp(C))
print(np.sqrt(C))
a = np.floor(10*np.random.random((3,4)))
print(a)
print(a.ravel())
21.T 求矩陣的轉置,行變列,列變行
a = np.array([20,30,40,50])
print(a.T)
# -1的意思是讓程式自己取列數,因為行數一給,列數已經确定了
a.reshape(3,-1)
22. 矩陣拼接
np.stack() 為拼接操作;hstack()為橫着按行拼接
np.vstack() 為縱着按列拼接
a = np.floor(10*np.random.random((2,2)))
b = np.floor(10*np.random.random((2,2)))
print(a)
print('--------')
print(b)
print('--------')
print(np.hstack((a,b)))
print('--------')
print(np.vstack((a,b)))
print(np.stack((a,b)))
23.矩陣切分
np.hsplit(x,y) 将矩陣x平均切y份
np.vsplit(a,3) 将矩陣a按行平均切3份
a = np.floor(10*np.random.random((2,12)))
print(a)
print('--------')
print(np.hsplit(a,3))
#将矩陣a先從第3列切一刀,再從第4列切一刀分成三個小矩陣
print(np.hsplit(a,(3,4)))
print(np.vsplit(a,3))
24.複制
将a指派給b,a和b的記憶體位址是相同的,改變a或b,另一個也會跟着改變
a = np.arange(12)
b = a
print(b is a)
b.shape = (3,4)
print(a.shape)
print(id(a)) #a,b的記憶體位址相同
print(id(b))
view() 淺複制,兩資料的記憶體位址不同,但是改變一個,另一個也會跟着改變
c = a.view()
print(c is a)
c.shape = (2,6)
print(a.shape)
c[0,4] = 1234
print(a)
print(c)
print(id(a))
print(id(c))
copy() 深複制,兩資料的記憶體位址不同,改變一個,另一個不會跟着改變
d = a.copy()
print(d is a)
d[0,0] = 9999
print(d)
print(a)
print(id(a))
print(id(d))
argmax(axis=0) 按列找出矩陣中每列的最大值索引(下标)
data = np.sin(np.arange(20)).reshape(5,4)
print(data)
ind = data.argmax(axis=0) #按列找最大值的索引值(下标)
print(ind)
data_max = data[ind,range(data.shape[1])] #通過下标再找出最大值
print(data_max)
np.tile(a,(x,y)) 矩陣擴充,再矩陣a上行擴充為原來的x倍,列擴充為原來的y倍
a = np.arange(0,40,10)
print(a)
b = np.tile(a,(2,3))
print(b)
25. 排序
np.sort(x,axis=1)或x.sort(axis=1) 排序,按行對x進行排序
np.argsort(x) 對x進行排序,每次傳回最小值的索引(下标)
a = np.array([[4,3,5],
[1,2,1]])
print(a)
print('--------')
b = np.sort(a,axis=1)
print(b)
a.sort(axis=1)
print('--------')
print(a)
a = np.array([4,3,1,2])
j = np.argsort(a)
print('--------')
print(j)
print('--------')
print(a[j])
26.Numpy廣播(Broadcast)
廣播(Broadcast)是 numpy 對不同形狀(shape)的數組進行數值計算的方式, 對數組的算術運算通常在相應的元素上進行。
如果兩個數組 a 和 b 形狀相同,即滿足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 數組對應位相乘。這要求維數相同,且各次元的長度相同。
import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print (c)
輸出結果為:
當運算中的 2 個數組的形狀不同時,numpy 将自動觸發廣播機制。如:
import numpy as np
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
輸出結果為:
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
下面的圖檔展示了數組 b 如何通過廣播來與數組 a 相容:
例:
import numpy as np
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
bb = np.tile(b, (4, 1)) # 重複 b 的各個次元
print(a + bb)
輸出結果為:
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
廣播的規則:
簡單了解:對兩個數組,分别比較他們的每一個次元(若其中一個數組沒有目前次元則忽略),滿足:
- 讓所有輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都通過在前面加 1 補齊。
- 輸出數組的形狀是輸入數組形狀的各個次元上的最大值。
- 如果輸入數組的某個次元和輸出數組的對應次元的長度相同或者其長度為 1 時,這個數組能夠用來計算,否則出錯。
- 當輸入數組的某個次元的長度為 1 時,沿着此次元運算時都用此次元上的第一組值。
若條件不滿足,抛出 “ValueError: frames are not aligned” 異常。
- 數組擁有相同形狀。
- 目前次元的值相等。
- 目前次元的值有一個是 1。
以上為我自己對Numpy用法的部分總結。