Maison > développement back-end > Tutoriel Python > Comment les fonctions vectorisées de NumPy peuvent-elles justifier efficacement les tableaux ?

Comment les fonctions vectorisées de NumPy peuvent-elles justifier efficacement les tableaux ?

DDD
Libérer: 2024-12-09 11:05:06
original
297 Les gens l'ont consulté

How Can NumPy's Vectorized Functions Efficiently Justify Arrays?

Justifier les tableaux NumPy avec des fonctions vectorisées

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.

Énoncé du problème

É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.

Solution Numpy

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
Copier après la connexion

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.

Exemple d'utilisation

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)
Copier après la connexion

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]]
Copier après la connexion

Justifier un tableau générique à N dimensions

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal