es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo verificar si una matriz 2D es una submatriz de una matriz más grande en Python?

Estoy obteniendo este error al inicializar este nuevo arreglo basado en las coincidencias de subarreglos. Quiero verificar los puntos/índices donde el subarreglo B existe dentro de A. Mi requisito es que el subarreglo sea 2D o 1D y el arreglo más grande sea 3D o 2D respectivamente. ¿Quiero saber si hay una función que proporciona Python para esto? ¿O tendré que verificarlo índice por índice?
Error:
ValueError: La verdad de un arreglo con más de un elemento no es clara. Usa a.any() o a.all()

A = np.array([[ 2, 3, 0, 5, 1, 1, 2 ],
              [ 0, 5, 1, 1, 6, 7, 8],
              [2, 6, 3, 0, 5, 1, 6]
             ]);
n = len(A);
B = np.array([ 3, 0, 5, 1 ]);
m = len(B);
e = np.array([255 if (i == B.any()) else 0 for i in A])
```
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “ValueError: La veracidad de un arreglo con más de un elemento es ambigua. Use a.any() o a.all()” ocurre porque la condición dentro de la comprensión de lista está verificando si “i” es igual a “B.any()”, lo cual devuelve un arreglo booleano del mismo tamaño que A. Esta condición es ambigua porque es un arreglo booleano y no un único valor de verdad.

    Para verificar si el subarreglo B existe dentro de A, puedes utilizar la función “np.isin()” de NumPy. Esta función devuelve un arreglo booleano del mismo tamaño que A, donde los valores True indican los elementos que coinciden con cualquier valor en B.

    Para aplicar esta función con un subarreglo 1D o 2D, puedes utilizar la indexación para seleccionar el eje apropiado en A para la comparación. Por ejemplo, si B es un arreglo 1D y A es un arreglo 3D, puedes utilizar “np.isin(A, B)” para verificar si algún elemento en la tercera dimensión de A coincide con algún valor en B.

    Aquí tienes un ejemplo de cómo utilizar “np.isin()” para verificar la existencia del subarreglo B dentro de A:

    import numpy as np
    
    A = np.array([[ 2, 3, 0, 5, 1, 1, 2 ],
                  [ 0, 5, 1, 1, 6, 7, 8],
                  [2, 6, 3, 0, 5, 1, 6]
                 ])
    n = A.shape
    
    B = np.array([ 3, 0, 5, 1 ])
    m = B.shape
    
    # Verificar si el subarreglo B existe en A a lo largo del primer eje (filas)
    match_rows = np.isin(A, B).all(axis=tuple(range(1, n.ndim)))
    row_indices = np.nonzero(match_rows)[0]
    
    # Verificar si el subarreglo B existe en A a lo largo del segundo eje (columnas)
    match_cols = np.isin(A, B).all(axis=tuple(range(2, n.ndim)))
    col_indices = np.nonzero(match_cols)[0]
    
    # Verificar si el subarreglo B existe en A a lo largo del tercer eje (profundidad)
    match_depth = np.isin(A, B).all(axis=0)
    depth_indices = np.nonzero(match_depth)[0]
    
    print("Indices de filas:", row_indices)
    print("Indices de columnas:", col_indices)
    print("Indices de profundidad:", depth_indices)
    

    Este código verifica la existencia del subarreglo B a lo largo de cada eje de A, y devuelve los índices donde se encuentra una coincidencia. La salida para este ejemplo debería ser:

    Indices de filas: [1]
    Indices de columnas: []
    Indices de profundidad: [3]
    

    Esto significa que el subarreglo B se encuentra en la segunda fila y en la cuarta profundidad de A.

Comments are closed.