首頁 >後端開發 >Python教學 >NumPy 的向量化函數如何有效證明陣列的合理性?

NumPy 的向量化函數如何有效證明陣列的合理性?

DDD
DDD原創
2024-12-09 11:05:06276瀏覽

How Can NumPy's Vectorized Functions Efficiently Justify Arrays?

使用向量化函數來證明NumPy 數組

NumPy 提供了使用矢量化函數來證明數組的有效方法,與傳統的Python 循環相比,提供了更高的效能和程式碼簡單性。

問題陳述

給定 NumPy數組,任務是將其非零元素向左、向右、向上或向下移動,同時保持其形狀。

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]]

證明通用NN>輸出:

證明通用NN維數組
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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn