NumPy 提供了使用矢量化函數來證明數組的有效方法,與傳統的Python 循環相比,提供了更高的效能和程式碼簡單性。
給定 NumPy數組,任務是將其非零元素向左、向右、向上或向下移動,同時保持其形狀。
以下NumPy 實現執行有效的對齊:
import numpy as np def justify(a, invalid_val=0, axis=1, side='left'): if invalid_val is np.nan: mask = ~np.isnan(a) else: mask = a!=invalid_val justified_mask = np.sort(mask,axis=axis) if (side=='up') | (side=='left'): justified_mask = np.flip(justified_mask,axis=axis) out = np.full(a.shape, invalid_val) if axis==1: out[justified_mask] = a[mask] else: out.T[justified_mask.T] = a.T[mask.T] return out
此函數沿著指定的軸和邊(左、右、上、下)對齊2D 數組。它的工作原理是使用 mask 識別非零元素,使用 sort 對它們進行排序,如果向上或向左對齊則翻轉 mask,最後用對齊的值覆蓋原始數組。
這是一個使用範例,涵蓋了非零元素左:
a = np.array([[1,0,2,0], [3,0,4,0], [5,0,6,0], [0,7,0,8]]) # Cover left covered_left = justify(a, axis=1, side='left') print("Original Array:") print(a) print("\nCovered Left:") print(covered_left)
輸出:
Original Array: [[1 0 2 0] [3 0 4 0] [5 0 6 0] [0 7 0 8]] Covered Left: [[1 2 0 0] [3 4 0 0] [5 6 0 0] [7 8 0 0]]
def justify_nd(a, invalid_val, axis, side): pushax = lambda a: np.moveaxis(a, axis, -1) if invalid_val is np.nan: mask = ~np.isnan(a) else: mask = a!=invalid_val justified_mask = np.sort(mask,axis=axis) if side=='front': justified_mask = np.flip(justified_mask,axis=axis) out = np.full(a.shape, invalid_val) if (axis==-1) or (axis==a.ndim-1): out[justified_mask] = a[mask] else: pushax(out)[pushax(justified_mask)] = pushax(a)[pushax(mask)] return out
為了證明 N維數組,可以使用以下函數:
此函數透過沿任意軸對齊 N 維數組來支援更複雜的場景到數組的「前面」或「末尾」。以上是NumPy 的向量化函數如何有效證明陣列的合理性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!