NumPy是Python科學計算的核心庫之一,用來進行科學計算,數值分析等矩陣運算。主要提供了以下幾種功能:
1.多維陣列(ndarray)物件,可以進行快速的數值計算和陣列操作;
2.廣播(Broadcast)功能,可以對不同形狀的陣列進行算術運算;
3.數學函數庫,可以對陣列進行各種數學運算;
4.線性代數、傅立葉變換、亂數生成等工具操作;
5.不同資料型別之間的傳輸功能;
6.資料的輸入和輸出功能。
在NumPy中,最重要的是它的ndarray物件,多為n維陣列,因此它非常適合處理科學計算中的向量、矩陣等資料結構。numpy比列表更加高效,可以大大提高程式執行速度,是資料處理和科學計算的主要工具之一。
在 NumPy 中,我們可以使用 random 模組來生成亂數。
下面是一些常用的亂數生成函數:
np.random.rand():生成 0 到 1 之間的隨機浮點數,可以接收任意個引數作為亂數生成器的形狀。
np.random.randn():生成符合標準正態分佈的亂數,可以接收任意個引數作為亂數生成器的形狀。
np.random.randint():生成整數型的亂數,可以接收兩個引數:最小值和最大值。
np.random.random():生成 0 到 1 之間的隨機浮點數,可以接收一個引數作為輸出的形狀。
np.random.shuffle():隨機打亂一個序列,可以接收一個引數作為要打亂的序列。
np.random.choice():從指定的序列中隨機挑選一個元素,可以接收兩個引數:序列和挑選出元素的數量。
import numpy as np
# 生成一個形狀為 (3, 2) 的隨機浮點數陣列
arr1 = np.random.rand(3, 2)
# 生成一個形狀為 (3, 2) 的符合標準正態分佈的亂數陣列
arr2 = np.random.randn(3, 2)
# 生成 0 到 9 之間的隨機整數
randint = np.random.randint(10)
# 生成一個形狀為 (1, 3) 的隨機浮點數陣列
arr3 = np.random.random((1, 3))
# 打亂一個序列
arr4 = np.arange(10)
np.random.shuffle(arr4)
# 從指定的序列中隨機挑選一個元素
choice = np.random.choice([1, 2, 3, 4, 5, 6], 1)
NumPy中NDArray(N-dimensional array)物件有以下特點:
它是多維陣列,可以表示任意維度的資料。
所有元素必須是同一型別的資料。
它支援向量化操作,即對整個陣列的操作只需要一條語句即可實現。
它快速且高效,因為它是使用C語言實現的,並且在記憶體使用和計算效率方面進行了優化。
它提供了大量的科學計算函數和方法,包括線性代數、傅立葉變換、統計分析等。
它易於與其他資料處理工具(如Pandas、SciPy等)整合使用,可以提高資料分析處理效率,並且支援巨量資料量的高效處理。
使用diag函數建立對角矩陣
import numpy as np
# 建立一個3x3的對角矩陣,對角線元素為1
diag_matrix = np.diag([1, 1, 1])
print(diag_matrix)
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
你也可以在diag函數中使用一個數位來建立對應大小的對角矩陣。
# 建立一個5x5的對角矩陣,對角線元素為2
diag_matrix = np.diag(2*np.ones(5))
print(diag_matrix)
array([[2., 0., 0., 0., 0.],
[0., 2., 0., 0., 0.],
[0., 0., 2., 0., 0.],
[0., 0., 0., 2., 0.],
[0., 0., 0., 0., 2.]])
NumPy提供了兩個方法flatten()和ravel()都可用於將多維陣列展平為一維陣列,不同之處在於ravel()返回的是原陣列的檢視,而flatten()返回的是原陣列的副本。下面是使用flatten()和ravel()方法展示多維陣列的方法:
1.使用flatten()方法
import numpy as np
# 建立一個2x3的二維陣列
a = np.array([[1, 2, 3], [4, 5, 6]])
# 展平陣列
b = a.flatten()
print('原陣列:')
print(a)
print('展平後的陣列:')
print(b)
原陣列:
[[1 2 3]
[4 5 6]]
展平後的陣列:
[1 2 3 4 5 6]
2.使用ravel()方法
import numpy as np
# 建立一個2x3的二維陣列
a = np.array([[1, 2, 3], [4, 5, 6]])
# 拉伸陣列
b = a.ravel()
print('原陣列:')
print(a)
print('拉伸後的陣列:')
print(b)
原陣列:
[[1 2 3]
[4 5 6]]
拉伸後的陣列:
[1 2 3 4 5 6]
NumPy的陣列廣播操作可以在不同形狀的陣列之間進行數學運算,簡化了陣列的操作和計算。陣列廣播主要遵循以下規則:
以下是一個範例,演示如何使用numpy進行陣列廣播:
import numpy as np
#建立兩個形狀不同的陣列
a = np.array([1, 2, 3])
b = np.array([[1], [2], [3]])
#列印兩個陣列的形狀
print("a.shape = ", a.shape)
print("b.shape = ", b.shape)
#使用陣列廣播計算a和b的和
c = a + b
print("a + b = \n", c)
a.shape = (3,)
b.shape = (3, 1)
a + b =
[[2 3 4]
[3 4 5]
[4 5 6]]
在這個範例中,我們建立了兩個陣列a和b,它們的形狀不同。然後,我們使用陣列廣播計算a和b的和。由於a和b的形狀不同,我們可以將維度較小的陣列b延伸為維度相等的陣列,以相容它們之間的加法運算。最後,我們將結果儲存在新陣列c中。
NumPy可以使用切片和布林索引來選擇陣列的子集。、
使用切片可以選擇陣列的某一部分,例如:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = a[1:4] # 選擇a[1]到a[3]的元素
print(b) # 輸出 [2 3 4]
也可以對多維陣列進行切片,例如:
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = a[0:2, 1:3] # 選擇a中第1列到第2列、第2行到第3行的元素
print(b) # 輸出 [[2 3]
# [5 6]]
使用布林索引可以根據某種條件選擇陣列中的元素,例如:
a = np.array([1, 2, 3, 4, 5])
b = a[a > 2] # 選擇a中大於2的元素
print(b) # 輸出 [3 4 5]
也可以對多維陣列使用布林索引,例如:
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = a[a > 2] # 選擇a中大於2的元素
print(b) # 輸出 [3 4 5 6 7 8 9]
注意,布林索引返回的是一維陣列,需要使用reshape方法將其轉換為多維陣列。可以使用np.where來進行更復雜的條件選擇。
NumPy是Python語言的一個擴充套件庫,專門處理大型多維陣列與矩陣運算。NumPy提供了許多線性代數和矩陣操作函數。下面是使用NumPy進行矩陣運算的一些例子:
要使用NumPy建立一個矩陣,可以使用numpy.array()函數,並將二維陣列傳遞給它。
import numpy as np
# 建立一個3x3的矩陣
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)
# 輸出:
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
要使用NumPy將矩陣轉置,可以使用numpy.transpose()函數。
import numpy as np
# 建立一個3x3的矩陣
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)
# 轉置矩陣
matrix_transpose = np.transpose(matrix)
print(matrix_transpose)
# 輸出:
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[1 4 7]
# [2 5 8]
# [3 6 9]]
要使用NumPy對矩陣進行加法和減法操作,可以使用numpy.add()和numpy.subtract()函數。
import numpy as np
# 建立兩個矩陣
matrix_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix_b = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])
# 矩陣相加
matrix_sum = np.add(matrix_a, matrix_b)
print(matrix_sum)
# 矩陣相減
matrix_diff = np.subtract(matrix_a, matrix_b)
print(matrix_diff)
# 輸出:
# [[10 10 10]
# [10 10 10]
# [10 10 10]]
# [[-8 -6 -4]
# [-2 0 2]
# [ 4 6 8]]
要使用NumPy進行矩陣乘法,可以使用numpy.dot()函數。
import numpy as np
# 建立兩個矩陣
matrix_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix_b = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])
# 矩陣乘法
matrix_prod = np.dot(matrix_a, matrix_b)
print(matrix_prod)
# 輸出:
# [[ 30 24 18]
# [ 84 69 54]
# [138 114 90]]
要使用NumPy計算行列式和逆矩陣,可以使用numpy.linalg.det()和numpy.linalg.inv()函數。
import numpy as np
# 建立一個3x3的矩陣
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 計算矩陣的行列式
matrix_det = np.linalg.det(matrix)
print(matrix_det)
# 計算矩陣的逆矩陣
matrix_inv = np.linalg.inv(matrix)
print(matrix_inv)
# 輸出:
# 0.0
# [[-3.00000000e+00 6.00000000e+00 -3.00000000e+00]
# [ 6.00000000e+00 -1.20000000e+01 6.00000000e+00]
# [-3.00000000e+00 6.00000000e+00 -3.00000000e+00]]
這些只是NumPy中可用的許多矩陣運算之一。NumPy庫還提供了其他矩陣運算,如解線性方程組等等 逆矩陣可以計算其它方面的線性代數問題,如解線性方程組,這是資料科學中不可或缺的。
使用NumPy進行資料的離散化和分組操作可以使用numpy.digitize和numpy.bincount函數。
numpy.digitize函數可以將一組資料劃分為不同的區間,返回每個資料所屬的區間編號;numpy.bincount函數可以統計每個區間內資料的數量。這兩個函數的聯合使用可以實現資料的離散化和分組操作。
例如,對資料進行10個區間的離散化,並統計每個區間內資料的數量可以使用以下程式碼:
import numpy as np
data = np.array([1, 4, 8, 3, 6, 9, 2, 5, 7, 10])
bins = np.linspace(0, 10, 11) # 劃分為10個區間
indices = np.digitize(data, bins) # 劃分資料所屬區間
counts = np.bincount(indices)
上述程式碼執行完畢後,counts陣列中即為每個區間內資料的數量。可以在此基礎上進行更多操作,例如計算每個區間內資料的平均值等。
NumPy可以通過多種方式進行陣列的輸入和輸出,包括文字檔案、二進位制檔案、記憶體緩衝等。
下面是一些常見的陣列輸入和輸出的方法和範例:
import numpy as np
import io
# 從文字檔案讀取陣列
data = np.loadtxt('data.txt')
print(data)
# 將陣列儲存到文字檔案中
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.savetxt('data.txt', data)
# 從二進位制檔案讀取陣列
data = np.load('data.npy')
print(data)
# 將陣列儲存到二進位制檔案中
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.save('data.npy', data)
# 從記憶體緩衝讀取陣列
str_data = '1 2 3\n4 5 6\n7 8 9'
data = np.genfromtxt(str_data.splitlines(), delimiter=' ')
print(data)
# 將陣列儲存到記憶體緩衝中
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
output = io.StringIO()
np.savetxt(output, data, delimiter=',')
str_data = output.getvalue()
print(str_data)
除此之外,NumPy還提供了很多其他的輸入和輸出方式,如Pandas DataFrame、HDF5等。具體可以查閱官方檔案。