張量(Tensor)、標量(scalar)、向量(vector)、矩陣(matrix)
Python Numpy 切片和索引(高級索引、布爾索引、花式索引)
Python NumPy 廣播(Broadcast)
NumPy(Numerical Python) 是 Python 語言的一個擴展程式庫,支持大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫,
NumPy 是一個運行速度非常快的數學庫,主要用于陣列計算,包含:
- 一個強大的N維陣列物件 ndarray
- 廣播功能函式
- 整合 C/C++/Fortran 代碼的工具
- 線性代數、傅里葉變換、亂數生成等功能
NumPy 應用
NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪圖庫)一起使用, 這種組合廣泛用于替代 MatLab,是一個強大的科學計算環境,有助于我們通過 Python 學習資料科學或者機器學習,
SciPy 是一個開源的 Python 演算法庫和數學工具包,
SciPy 包含的模塊有最優化、線性代數、積分、插值、特殊函式、快速傅里葉變換、信號處理和影像處理、常微分方程求解和其他科學與工程中常用的計算,
Matplotlib 是 Python 編程語言及其數值數學擴展包 NumPy 的可視化操作界面,它為利用通用的圖形用戶界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向應用程式嵌入式繪圖提供了應用程式介面(API),
切片和索引
arr[x][y] = arr[x,y] 兩種表達方式
import numpy as np
arr = np.arange(21) # arange() 函式創建 ndarray 物件
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
'''
arr[x][y] = arr[x,y] 兩種表達方式
冒號 : 的解釋:如果只放置一個引數,
如 [2],將回傳與該索引相對應的單個元素,
如 [2:],表示從該索引開始以后的所有項都將被提取,如果使用了兩個引數,
如 [2:7],那么則提取兩個索引(不包括停止索引)之間的項,
'''
print('arr[1:2] =>', arr[1:2]) # 【1~2] 行,右側不包含,列全部顯示 => [[ 7 8 9 10 11 12 13]]
print('arr[1:] =>', arr[1:]) # 1 行開始,剩下的全部顯示,列全部顯示 => [[ 7 8 9 10 11 12 13] [14 15 16 17 18 19 20]]
print('arr[:2] =>', arr[:2]) # 取前面兩行資料 [[ 0 1 2 3 4 5 6] [ 7 8 9 10 11 12 13]]
print('arr[2][1:6:2] =>', arr[2][1:6:2]) # start:stop:step => 第2行,1~6列,步長2(默認為1) [15 17 19]
print('arr[2, 1:6:2] =>', arr[2, 1:6:2]) # start:stop:step => 第2行,1~6列,步長2(默認為1) [15 17 19]
print('arr[:2, 1:6:2] =>', arr[:2, 1:6:2]) # start:stop:step => 前2行,1~6列,步長2(默認為1) [[ 1 3 5] [ 8 10 12]]
print('\n')
'''
切片還可以包括省略號 … ,來使選擇元組的長度與陣列的維度相同, 如果在行位置使用省略號,它將回傳包含行中元素的 ndarray,
'''
print('arr[1] => ', arr[1]) # 1行,所有列資料 [ 7 8 9 10 11 12 13]
print('arr[1, ...] => ', arr[1, ...]) # 1行,所有列資料 [ 7 8 9 10 11 12 13]
print('arr[..., 3] => ', arr[..., 3]) # 所有行,第3列資料 [ 3 10 17]
print('arr[1] => ', arr[..., 2:]) # 所有行 第3列及剩下的所有元素
print('\n')
高級索引
NumPy 中的高級索引指的是使用整數陣列、布爾陣列或者其他序列來訪問陣列的元素,相比于基本索引,高級索引可以訪問到陣列中的任意元素,并且可以用來對陣列進行復雜的操作和修改,

import numpy as np
arr = np.arange(21) # arange() 函式創建 ndarray 物件
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
'''
高級索引
'''
# 整數陣列索引是指使用一個陣列來訪問另一個陣列的元素,這個陣列中的每個元素都是目標陣列中某個維度上的索引值,
print('arr[[0, 1, 2], [2, 1, 3]] => ', arr[[0, 1, 2], [2, 1, 3]]) # [0,2]、【1,1】、[2,3] => [ 2 8 17]
rows = np.array([[0, 1], [2, 1], [1, 0]])
cols = np.array([[2, 1], [3, 2], [0, 2]])
'''
0,2 1,1
2,3 1,2
1,0 0,2
'''
print('arr[rows, cols] => ', arr[rows, cols]) # [[ 2 8] [17 9] [7 2]]
print('\n')
'''
可以借助切片 : 或 … 與索引陣列組合,
'''
print('arr[1:3, 1:4] => ', arr[1:3, 1:4]) # [[ 8 9 10] [15 16 17]]
print('arr[1:3, [1, 4]] => ', arr[1:3, [1, 4]]) # [[ 8 11] [15 18]]
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print('arr[..., 1:] => ', arr[..., 1:]) # [[ 1 2 3 4 5 6] [ 8 9 10 11 12 13] [15 16 17 18 19 20]]



布爾索引
我們可以通過一個布爾陣列來索引目標陣列,
布爾索引通過布爾運算(如:比較運算子)來獲取符合指定條件的元素的陣列,
import numpy as np
arr = np.arange(21) # arange() 函式創建 ndarray 物件
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
'''
獲取大于 5 的元素
'''
print('arr[arr > 5]', arr[arr > 5]) # [ 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
'''
~(取補運算子)來過濾NaN,
'''
arr = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
print('arr[~np.isnan(a)]', arr[~np.isnan(arr)]) # [1. 2. 3. 4. 5.]
'''
從陣列中過濾掉非復數元素,
'''
arr = np.array([1, 2 + 6j, 5, 3.5 + 5j])
print('arr[np.iscomplex(arr)]', arr[np.iscomplex(arr)]) # [2. +6.j 3.5+5.j]
花式索引
花式索引指的是利用整數陣列進行索引,
花式索引根據索引陣列的值作為目標陣列的某個軸的下標來取值,
對于使用一維整型陣列作為索引,如果目標是一維陣列,那么索引的結果就是對應位置的元素,如果目標是二維陣列,那么就是對應下標的行,
花式索引跟切片不一樣,它總是將資料復制到新陣列中,
一維陣列
一維陣列只有一個軸 axis = 0,所以一維陣列就在 axis = 0 這個軸上取值:
import numpy as np
x = np.arange(9) # [0 1 2 3 4 5 6 7 8]
print(x)
# 一維陣列讀取指定下標對應的元素
print("-------讀取下標對應的元素-------")
x2 = x[[0, 6]] # 使用花式索引
print(x2) # [0 6]
print(x2[0]) # 0
print(x2[1]) # 6
二維陣列
import numpy as np
arr = np.arange(21) # arange() 函式創建 ndarray 物件
# arr = arr.reshape(3, 7)
arr.shape = (3, 7)
'''
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]]
'''
print(arr)
print('\n')
print('arr[1, [0, 2]] => ', arr[1, [0, 2]]) # [7 9]
print('arr[[0, 2], 1] => ', arr[[0, 2], 1]) # [ 1 15]
print('arr[[0, 2]] => ', arr[[0, 2]]) # [[ 0 1 2 3 4 5 6] [14 15 16 17 18 19 20]]
# 傳入順序索引陣列
print('arr[[2,0,1]] => ', arr[[2, 0, 1]]) # [[14 15 16 17 18 19 20] [ 0 1 2 3 4 5 6] [ 7 8 9 10 11 12 13]]
# 傳入倒序索引陣列
print('arr[[-2,-0,-1]] => ', arr[[-2, -0, -1]]) # [[ 7 8 9 10 11 12 13] [ 0 1 2 3 4 5 6] [14 15 16 17 18 19 20]]
# 傳入多個索引陣列(要使用 np.ix_)
'''
np.ix_ 函式就是輸入兩個陣列,產生笛卡爾積的映射關系,
笛卡爾乘積是指在數學中,兩個集合 X 和 Y 的笛卡爾積(Cartesian product),又稱直積,表示為 X×Y,第一個物件是X的成員而第二個物件是 Y 的所有可能有序對的其中一個成員,
例如 A={a,b}, B={0,1,2},則:
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
[1, 0, 2, 1], [0, 3, 1, 2] => (1,0),(1,3),(1,1),(1,2),(0,0),(0,3),(0,1),(0,2)....
'''
print('arr[np.ix_([1,5,7,2],[0,3,1,2])] => ', arr[np.ix_([1, 0, 2, 1], [0, 3, 1, 2])]) # [[ 7 10 8 9] [ 0 3 1 2] [14 17 15 16] [7 10 8 9]]
相關鏈接
NumPy 官網 http://www.numpy.org/
NumPy 源代碼:https://github.com/numpy/numpy
SciPy 官網:https://www.scipy.org/
SciPy 源代碼:https://github.com/scipy/scipy
Matplotlib 教程:Matplotlib 教程
Matplotlib 官網:https://matplotlib.org/
Matplotlib 源代碼:https://github.com/matplotlib/matplotlib
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552519.html
標籤:其他
下一篇:返回列表
