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.

Matriz de NumPy de matrices de indexación.

Tengo un array de NumPy con forma (300, 500). Considéralo como una imagen con tamaño (300, 500) y hay 100 objetos en ella que quiero rellenar cada uno con un valor diferente.

py
imagen = np.zeros((300, 500))
/code>

Tengo coordenadas de cuadro delimitador (xmin, xmax, ymin, ymax) para cada uno de estos objetos. Luego creo arrays de indexación utilizando estas coordenadas de cuadro delimitador.

array<em>de</em>arrays<em>de</em>indexación<em>de</em>x = []
array<em>de</em>arrays<em>de</em>indexación<em>de</em>y = []

para obj en objetos:
   x<em>indices, y</em>indices = np.mgrid[obj.x<em>min: obj.x</em>max + 1, obj.y<em>min: obj.y</em>max + 1]
   x<em>indices, y</em>indices = x<em>indices.ravel(), y</em>indices.ravel()
   array<em>de</em>arrays<em>de</em>indexación<em>de</em>x.append(x<em>indices)
   array<em>de</em>arrays<em>de</em>indexación<em>de</em>y.append(y<em>indices)

Entonces, quiero asignar un valor diferente a la imagen para cada uno de estos objetos. Los valores para cada objeto los he almacenado en un array con forma (100,)

datos = np.array((100,))

Supongamos que llené los datos de la siguiente manera

datos[0] = 10
datos[1] = 2
...
datos[99] = 3

Luego lo que quiero hacer es lo siguiente:

para i en rango(len(objetos)):
   imagen[array<em>de</em>arrays<em>de</em>indexación<em>de</em>y[i], array<em>de</em>arrays<em>de</em>indexación<em>de</em>x[i]] = datos[i]

Pero quiero hacer esto al estilo de NumPy, he intentado lo siguiente pero no funciona:

py
imagen[array<em>de</em>arrays<em>de</em>indexación<em>de</em>y, array<em>de</em>arrays<em>de</em>indexación<em>de</em>x] = datos

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el enfoque anterior no funciona es porque array_of_x_indexing_arrays y array_of_y_indexing_arrays son listas de matrices numpy. Cuando se hace el indexado utilizando dos matrices, numpy utiliza la difusión para formar una matriz 2D de índices. En este caso, la difusión no es posible ya que las dos listas tienen longitudes diferentes. Por lo tanto, necesitamos convertir esas listas de matrices numpy en una sola matriz 2D. Podemos usar la función np.vstack() para apilar esas matrices verticalmente y la función np.transpose() para intercambiar las filas y columnas. Entonces, la forma correcta de hacer esto en NumPy es la siguiente:

    image[np.transpose(np.vstack((array_of_y_indexing_arrays, array_of_x_indexing_arrays)))] = data
    

    El np.vstack((array_of_y_indexing_arrays, array_of_x_indexing_arrays)) apila las matrices verticalmente, resultando en una matriz 2D donde cada fila contiene un índice x e y para un objeto. Luego, np.transpose() intercambia las filas y columnas para que obtengamos una matriz donde cada fila contiene un par de índices x e y para un objeto. Finalmente, usamos esta matriz 2D como índice para la matriz image para asignar los valores en la matriz data a los objetos correspondientes.

Comments are closed.