【技術積累】Python中的NumPy庫【一】

2023-06-08 12:01:28

NumPy庫是什麼

NumPy是Python科學計算的核心庫之一,用來進行科學計算,數值分析等矩陣運算。主要提供了以下幾種功能:

1.多維陣列(ndarray)物件,可以進行快速的數值計算和陣列操作;

2.廣播(Broadcast)功能,可以對不同形狀的陣列進行算術運算;

3.數學函數庫,可以對陣列進行各種數學運算;

4.線性代數、傅立葉變換、亂數生成等工具操作;

5.不同資料型別之間的傳輸功能;

6.資料的輸入和輸出功能。

在NumPy中,最重要的是它的ndarray物件,多為n維陣列,因此它非常適合處理科學計算中的向量、矩陣等資料結構。numpy比列表更加高效,可以大大提高程式執行速度,是資料處理和科學計算的主要工具之一。

如何在NumPy中生成亂數?

在 NumPy 中,我們可以使用 random 模組來生成亂數。

下面是一些常用的亂數生成函數:

  1. np.random.rand():生成 0 到 1 之間的隨機浮點數,可以接收任意個引數作為亂數生成器的形狀。

  2. np.random.randn():生成符合標準正態分佈的亂數,可以接收任意個引數作為亂數生成器的形狀。

  3. np.random.randint():生成整數型的亂數,可以接收兩個引數:最小值和最大值。

  4. np.random.random():生成 0 到 1 之間的隨機浮點數,可以接收一個引數作為輸出的形狀。

  5. np.random.shuffle():隨機打亂一個序列,可以接收一個引數作為要打亂的序列。

  6. 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物件有什麼特點?

NumPy中NDArray(N-dimensional array)物件有以下特點:

  1. 它是多維陣列,可以表示任意維度的資料。

  2. 所有元素必須是同一型別的資料。

  3. 它支援向量化操作,即對整個陣列的操作只需要一條語句即可實現。

  4. 它快速且高效,因為它是使用C語言實現的,並且在記憶體使用和計算效率方面進行了優化。

  5. 它提供了大量的科學計算函數和方法,包括線性代數、傅立葉變換、統計分析等。

  6. 它易於與其他資料處理工具(如Pandas、SciPy等)整合使用,可以提高資料分析處理效率,並且支援巨量資料量的高效處理。

如何使用NumPy建立對角矩陣?

使用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進行陣列展平和拉伸操作?

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的陣列廣播操作可以在不同形狀的陣列之間進行數學運算,簡化了陣列的操作和計算。陣列廣播主要遵循以下規則:

  1. 陣列維度不同,可以將維度較小的陣列延伸為維度較大的陣列,使它們的維度相等。
  2. 如果兩個陣列在某個維度上的形狀相同,或者其中一個陣列在該維度上的形狀為1,則稱它們在該維度上是相容的,可以進行數學運算。
  3. 在任何維度上,如果一個陣列形狀為1,則可以沿著該維度擴充套件為另一個陣列的對應維度。

以下是一個範例,演示如何使用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進行陣列的切片和子集選擇?

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進行矩陣運算和線性代數計算?

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進行資料的離散化和分組操作可以使用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如何進行陣列的輸入和輸出?

NumPy可以通過多種方式進行陣列的輸入和輸出,包括文字檔案、二進位制檔案、記憶體緩衝等。

下面是一些常見的陣列輸入和輸出的方法和範例:

  1. 從文字檔案讀取陣列:
  2. 將陣列儲存到文字檔案中:
  3. 從二進位制檔案讀取陣列:
  4. 將陣列儲存到二進位制檔案中:
  5. 從記憶體緩衝讀取陣列:
  6. 將陣列儲存到記憶體緩衝中:
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等。具體可以查閱官方檔案。