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.

Selección rápida de puntos de una matriz numpy grande

Ejemplo mínimo:

import numpy as np

list1 = [1,3,5,7]
list2 = [3,6,9,4]
list3 = [6,5,3,2]

arr = np.random.rand(72,22,22)

pos_list = np.vstack([list1, list2, list3]).T
print(pos_list)

print(arr[pos_list[0][0], pos_list[0][1], pos_list[0][2]])

for i in pos_list:
    print(arr[i[0], i[1], i[2]])

Mi compañero y yo estamos intentando aumentar la eficiencia de la selección de puntos anterior. Se generan muchas matrices muy grandes y a partir de estas matrices, se deben extraer muchos puntos específicos.

En el código anterior, el primer punto seleccionado es (list1[0], list2[0], list3[0]). Esto continúa hasta que se alcance el final de las listas (que son mucho más grandes).

¿Existe un enfoque vectorizado para esto, una forma de evitar el uso de bucles for, ya que esta operación en particular debe realizarse muchas veces?
¿O cualquier forma que sea más eficiente que el bucle for anteriormente mencionado?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay un enfoque vectorizado para esto. En lugar de usar un bucle for para acceder a cada punto individualmente, podemos usar la indexación avanzada de numpy para acceder directamente a todos los puntos que necesitamos de una sola vez. Podemos hacer esto pasando las tres listas (list1, list2 y list3) como una tupla a la matriz de numpy, de la siguiente manera:

    arr[list1, list2, list3]
    

    Esto devolverá una matriz de numpy que contiene todos los puntos que necesitamos. También podemos usar la indexación booleana para seleccionar puntos basados en alguna condición, de la siguiente manera:

    mask = arr > 0.5
    arr[mask]
    

    Esto devolverá una matriz de numpy que contiene solo los puntos donde el valor en arr es mayor que 0.5.

    Al utilizar estos enfoques vectorizados, podemos mejorar enormemente la eficiencia de nuestro código y evitar la necesidad de un bucle for.

Comments are closed.