Maison >développement back-end >Tutoriel Python >Comment les fonctions vectorisées de NumPy peuvent-elles justifier efficacement les tableaux ?
NumPy fournit des moyens efficaces de justifier des tableaux à l'aide de fonctions vectorisées, offrant des performances améliorées et une simplicité de code par rapport aux boucles Python traditionnelles.
Étant donné un tableau NumPy, la tâche consiste à décaler son éléments non nuls à gauche, à droite, en haut ou en bas tout en conservant sa forme.
L'implémentation NumPy suivante effectue une justification efficace :
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
Cette fonction justifie un tableau 2D le long de l'axe et du côté spécifiés (gauche, droite, haut, bas). Cela fonctionne en identifiant les éléments non nuls à l'aide d'un masque, en les triant à l'aide du tri, en retournant le masque s'il est justifié vers le haut ou vers la gauche, et enfin en écrasant le tableau d'origine avec les valeurs justifiées.
Voici un exemple d'utilisation qui couvre les éléments non nuls du gauche :
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)
Sortie :
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]]
Pour justifier un tableau à N dimensions, la fonction suivante peut être utilisée :
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
Cette fonction prend en charge des scénarios plus complexes en justifiant un tableau à N dimensions le long d'un axe arbitraire et soit au 'avant' ou 'fin' du tableau.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!