"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo pueden las funciones vectorizadas de Numpy justificar eficientemente las matrices?

¿Cómo pueden las funciones vectorizadas de Numpy justificar eficientemente las matrices?

Publicado el 2025-03-25
Navegar:789

How Can NumPy's Vectorized Functions Efficiently Justify Arrays?

justificación de matrices numpy con funciones vectorizadas

numpy proporciona formas eficientes para justificar las matrices usando funciones vectorizadas, ofreciendo un rendimiento mejorado y el código simplificado en comparación con la tarea tradicional de python. elementos distintos de cero a la izquierda, derecha, arriba o hacia abajo mientras mantienen su forma.

numpy solución

La siguiente implementación numpy realiza una justificación eficiente:

import numpy tan numpy Def justify (a, invalid_val = 0, axis = 1, lado = 'izquierda'): Si Invalid_Val es np.nan: máscara = ~ np.isnan (a) demás: máscara = a! = inválido_val justified_mask = np.sort (máscara, axis = eje) if (lado == 'arriba') | (lado == 'izquierda'): justified_mask = np.flip (justified_mask, axis = axis) out = np.full (a.shape, invalid_val) Si el eje == 1: out [justified_mask] = a [máscara] demás: out.t [justified_mask.t] = a.t [Mask.t] return out

Esta función justifica una matriz 2D a lo largo del eje especificado y el lado (izquierda, derecha, hacia arriba, hacia abajo). Funciona identificando elementos distintos de cero usando máscara, clasificándolos usando el tipo, volteando la máscara si se justifica hacia arriba o hacia la izquierda, y finalmente sobrescribe la matriz original con los valores justificados.

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

aquí es un ejemplo de uso que cubre los elementos de cero a la izquierda:

a = np.array ([1,2,2,2,2,2,2,2,2,2,0]. [3,0,4,0], [5,0,6,0], [0,7,0,8]]) # Cubierta a la izquierda cubierto_left = justify (a, axis = 1, lado = 'izquierda') Imprimir ("Array original:") Imprimir (a) imprimir ("\ ncovered izquierda:") print (cubierta_left)

output:

Array original: [[1 0 2 0] [3 0 4 0] [5 0 6 0] [0 7 0 8]] Cubierto a la izquierda: [[1 2 0 0] [3 4 0 0] [5 6 0 0] [7 8 0 0]]
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)
justificación para una matriz n-dimensional genérica

para justificar una matriz n-dimensional, se puede usar la siguiente función:
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)
def justify_nd (a, invalid_val, axis, lado): pushax = lambda a: np.moveaxis (a, eje, -1) Si Invalid_Val es np.nan: máscara = ~ np.isnan (a) demás: máscara = a! = inválido_val justified_mask = np.sort (máscara, axis = eje) Si el lado == 'Frente': justified_mask = np.flip (justified_mask, axis = axis) out = np.full (a.shape, invalid_val) if (axis ==-1) o (eje == A.NDIM-1): out [justified_mask] = a [máscara] demás: pushax (out) [pushax (justified_mask)] = pushax (a) [pushax (máscara)] Return out

Esta función admite escenarios más complejos justificando una matriz n-dimensional a lo largo de un eje arbitrario y al 'frente' o 'final' de la matriz.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3