NumPy 數組操作: 1、修改數組形狀 a、numpy.reshape(arr, newshape, order='C') 在不改變數據的條件下修改形狀 b、numpy.ndarray.flat 是一個數組元素迭代器 c、numpy.ndarray.flatten(self, order) 返回一 ...
NumPy 數組操作:
1、修改數組形狀
a、numpy.reshape(arr, newshape, order='C') 在不改變數據的條件下修改形狀
b、numpy.ndarray.flat 是一個數組元素迭代器
c、numpy.ndarray.flatten(self, order) 返回一份數組拷貝,對拷貝數組修改不會影響原數組
d、numpy.ravel(a, order='C') 展開數組元素,順序通常是 "C 風格",返回的是數組視圖,即修改會影響原始數組
import numpy as np # 將 1 維數組改變為形狀為 2*5 的數組 arr = np.arange(10).reshape(2, 5) print("arr: ", arr) for elem in arr.flat: elem = elem + 1 print(elem, end=" ") # 1 2...10 # 原數組未改變!!! print("\narr: ", arr) arr.shape = (5, 2) # [0 1 2 3 4 5 6 7 8 9] print("Order is C: ", arr.flatten()) # [0 2 4 6 8 1 3 5 7 9] print("Order is F: ", arr.flatten(order="F")) temp = arr.ravel() print("arr: ", temp) # 修改了展開數組下標為 2 的元素 arr.ravel()[2] = 10 print("arr: ", arr) # arr 發生改變
2、翻轉數組
a、numpy.transpose(arr, axes) 用於對換數組的維度
b、numpy.ndarray.T 類似 numpy.transpose()
c、numpy.rollaxis(arr, axis, start) 向後滾動特定的軸到一個特定位置
d、numpy.swapaxes(arr, axis1, axis2) 用於交換數組的兩個軸
import numpy as np # numpy.transpose(arr, axes) 用於對換數組的維度 arr = np.arange(1, 11).reshape(5, 2) print("transpose arr: ", np.transpose(arr)) # numpy.ndarray.T 類似 numpy.transpose() print("arr.T: ", arr.T) # numpy.rollaxis(arr, axis, start) 向後滾動特定的軸到一個特定位置 arr = np.arange(4).reshape(2, 2) print("rollaxis arr: ", np.rollaxis(arr, axis=1)) # [[0 2] [1 3]] # numpy.swapaxes(arr, axis1, axis2) 用於交換數組的兩個軸 print("swapaxes arr: ", np.swapaxes(arr, 1, 0)) # [[0 2] [1 3]]
3、修改數組維度
a、numpy.broadcast 用於模仿廣播的對象,它返回一個對象,該對象封裝了將一個數組廣播到另一個數組的結果
b、numpy.broadcast_to(array, shape, subok=False) 函數將數組廣播到新形狀。它在原始數組上返回只讀視圖,通常不連續。 如果新形狀不符合 NumPy 的廣播規則,該函數可能會拋出ValueError
c、numpy.expand_dims(arr, axis) 通過在指定位置插入新的軸來擴展數組形狀
d、numpy.squeeze(arr, axis) 從給定數組的形狀中刪除一維的條目
import numpy as np # numpy.broadcast 用於模仿廣播的對象,它返回一個對象,該對象封裝了將一個數組廣播到另一個數組的結果 x = np.array([[1], [2], [3]]) y = np.array([4, 5, 6]) # 它擁有 iterator 屬性,基於自身組件的迭代器元組 # 發生廣播,[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)] b = np.broadcast(x, y) c = np.empty(b.shape) # 生成形狀如 b 的隨機數組 print(c.shape) print('手動使用 broadcast 將 x 與 y 相加:') c.flat = [u + v for (u, v) in b] print("x+y: ", c) # 若把下麵 b 的代碼註釋掉時輸出空列表,以為迭代器指向末尾 b = np.broadcast(x, y) lst = [o for o in b] print("lst: ", lst) # numpy.broadcast_to(array, shape, subok) 將數組廣播到新形狀。它在原始數組上返回只讀視圖,通常不連續 a = np.array([[1], [2], [3]]) b = np.broadcast_to(a, (3, 2)) # [[1 1] [2 2] [3 3]] print("b: ", b) # numpy.expand_dims(arr, axis) 通過在指定位置插入新的軸來擴展數組形狀 a = np.array([[1, 2], [3, 4]]) print("shape of a: ", a.shape) # (2, 2) # 可以將 axis 看成數組形狀元組的下標,在對應下標插入新軸 b = np.expand_dims(a, axis=0) print("b: ", b) # [[[1 2] [3 4]]] print("shape of b: ", b.shape) # (1, 2, 2) b = np.expand_dims(a, axis=1) print("b: ", b) # [[[1 2]] [[3 4]]] print("shape of b: ", b.shape) # (2, 1, 2) # numpy.squeeze(arr, axis) 從給定數組的形狀中刪除一維的條目 x = np.arange(9).reshape(1, 3, 3) print("x: ", x) print("shape of x: ", x.shape) # (1, 3, 3) # 註意是一維的條目,若在這裡 axis=1 則會報錯,以為 axis=1 軸不為 1 y = np.squeeze(x, axis=0) print("y: ", y) print("shape of y: ", y.shape) # (3, 3)
4、連接數組
a、numpy.concatenate((a1, a2, ...), axis) 用於沿指定軸連接相同形狀的兩個或多個數組
b、numpy.stack(arrays, axis=0, out=None) 用於沿新軸連接數組序列
c、numpy.hstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過水平堆疊來生成數組
d、numpy.vstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過垂直堆疊來生成數組
import numpy as np # numpy.concatenate((a1, a2, ...), axis) 用於沿指定軸連接相同形狀的兩個或多個數組 a = np.array([[1, 2], [5, 6]]) b = np.array([[3, 4], [7, 8]]) # [[1 2 3 4] [5 6 7 8]] print("使用 1 軸連接 2 個數組: ", np.concatenate((a, b), axis=1)) # numpy.stack(arrays, axis) 用於沿新軸連接數組序列,arrays相同形狀的數組序列 # [[1 2] [5 6] [3 4] [7 8]] print("使用 0 軸堆疊 2 個數組: ", np.concatenate((a, b), axis=0)) # numpy.hstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過水平堆疊來生成數組 # [[1 2 3 4] [5 6 7 8]] print("水平堆疊: ", np.hstack((a, b))) # numpy.vstack((a1, a2, ...)) 是 numpy.stack 函數的變體,它通過垂直堆疊來生成數組 # [[1 2] [5 6] [3 4] [7 8]] print("垂直堆疊: ", np.vstack((a, b)))
5、分割數組
a、numpy.split(ary, indices_or_sections, axis) 沿特定的軸將數組分割為子數組
b、numpy.hsplit(ary, indices_or_sections) 用於水平分割數組,通過指定要返回的相同形狀的數組數量來拆分原數組
c、numpy.vsplit(ary, indices_or_sections) 用於垂直分割數組,其分割方式與hsplit用法相同
import numpy as np
# numpy.split(ary, indices_or_sections, axis) 沿特定的軸將數組分割為子數組 # indices_or_sections:果是一個整數,就用該數平均切分,如果是一個數組,為沿軸切分的位置(左開右閉) arr = np.linspace(1, 100, 10) print("每個子數組長度為 2 分割:", np.split(arr, 5)) # 分割成 arr[0...2) arr[2...4) arr[4...7) arr[7...-1] print("按特定下標分割:", np.split(arr, [2, 4, 7])) # numpy.hsplit(ary, indices_or_sections) 函數用於水平分割數組,通過指定要返回的相同形狀的數組數量來拆分原數組 arr = arr.reshape(2, 5) print("After reshape arr: ", arr) print("hsplit the arr: ", np.hsplit(arr, 5)) # numpy.vsplit(ary, indices_or_sections) 沿著垂直軸分割,其分割方式與 hsplit 用法相同 print("vsplit the arr: ", np.vsplit(arr, 2))
6、數組元素的添加與刪除
a、numpy.resize(arr, shape) 返回指定大小的新數組;若新數組大小大於原始大小,則包含原始數組中的元素的副本
b、numpy.append(arr, values, axis=None) 在數組的末尾添加值
c、numpy.insert(arr, obj, values, axis=None) 在給定索引之前,沿給定軸在輸入數組中插入值,obj 為索引
d、numpy.delete(arr, obj, axis) 返回從輸入數組中刪除指定子數組的新數組,obj 為索引
e、numpy.unique(arr, return_index, return_inverse, return_counts) 用於去除數組中的重覆元素
import numpy as np # numpy.resize(arr, shape) 返回指定大小的新數組;若新數組大小大於原始大小,則包含原始數組中的元素的副本 arr = np.sin(np.array([0, 30, 45, 60, 90, 120, 135, 150, 180]).reshape(3, 3) * np.pi/180) np.set_printoptions(precision=1) # 保留小數點後一位 print("resize(arr, (1, 9)): ", np.resize(arr, (1, 9))) # 大小大於原始大小,將數組的頭 3 個的副本保存到最後一行 print("resize(arr, (4, 3)): ", np.resize(arr, (4, 3))) # 保存數組第一個元素的副本到末尾 print("resize(arr, (2, 5)): ", np.resize(arr, (2, 5))) np.set_printoptions(precision=8) # 預設為 8 # numpy.append(arr, values, axis=None) 在數組的末尾添加值 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 當axis無定義時,是橫向加成,返回總是為一維數組 # [1 2 3 4 5 6 7 8 9] print("append(arr, [7, 8, 9]): ", np.append(arr, [7, 8, 9])) # 按 0 軸加成,列數要相同,還有就是追加的是二維數組 # [[1 2 3] [4 5 6] [7 8 9]] print("append(arr, [7, 8, 9], axis=0): ", np.append(arr, [[7, 8, 9]], axis=0)) # 註意行數要相同,[[1 2 3 4 5 6] [4 5 6 7 8 9]] print("append(arr, [[4, 5, 6], [7, 8, 9]], axis=1): ", np.append(arr, [[4, 5, 6], [7, 8, 9]], axis=1)) # numpy.insert(arr, obj, values, axis) 在給定索引之前,沿給定軸在輸入數組中插入值 arr = np.array([1, 2, 3, 4, 5, 6]).reshape(3, 2) # 如果未提供軸,則輸入數組會被展開 print("insert(arr, 3, [6, 6, 6]): ", np.insert(arr, 3, [6, 6, 6])) print("insert(arr, 3, [7, 8], axis=0): ", np.insert(arr, 3, [7, 8], axis=0)) # 若形狀不匹配,還會試圖廣播數組 print("insert(arr, 1, [6], axis=1): ", np.insert(arr, 1, [6], axis=1)) # numpy.delete(arr, obj, axis) 返回從輸入數組中刪除指定子數組的新數組 # 如果未提供軸,則輸入數組會被展開 print("delete(arr, 2): ", np.delete(arr, 2)) # 分別按 0 軸和 1 軸刪除下標為 1 的元素 print("delete(arr, 1, axis=0): ", np.delete(arr, 1, axis=0)) print("delete(arr, 1, axis=1): ", np.delete(arr, 1, axis=1)) # numpy.unique(arr, return_index, return_inverse, return_counts) 用於去除數組中的重覆元素 arr = np.array([5, 3, 4, 2, 2, 1, 9, 0, 3, 4]) print("unique(arr): ", np.unique(arr)) # 若 return_index=True 則返回新元素在舊數組中(第一個符合的元素)的下標 print("unique(arr, return_index=True): ", np.unique(arr, return_index=True)) # 若 return_inverse=True 則返回舊數組元素在新數組中的下標 print("unique(arr, return_inverse=True): ", np.unique(arr, return_inverse=True)) # 若 return_counts=True 則返回對應元素在原數組中出現的次數 print("unique(arr, return_counts=True): ", np.unique(arr, return_counts=True))