Si bien no creo que esto sea demasiado complejo, estoy luchando con la forma de buscar incluso preguntas / respuestas similares.

Tengo dos matrices.

Indices_array: [0, 1, 1, 0, 0, 1, 0]

Matriz_valor: [1, 2, 3, 4, 5, 6, 7]

Quiero crear una nueva matriz usando la primera matriz como índices para la asignación y la segunda matriz para los valores. Esto debería dar como resultado una nueva matriz con dos valores por índice, sin embargo, un valor es cero y el otro es el valor de mi segunda matriz.

Usando mis matrices de ejemplo anteriores, debería resultar en:

[[1, 0],
 [0, 2],
 [0, 3],
 [4, 0],
 [5, 0],
 [0, 6],
 [7, 0]]

Puedo crear fácilmente una versión vacía de mi matriz deseada usando: np.zeros((total_len, values_per_index))

Mi intuición falla cuando intento algo como: target_array[indices_array] = value_array

Creo que entiendo por qué falla mi método intentado, pero cómo lograrlo realmente se me escapa. ¿Hay una manera simple de hacer esto? Python no es mi mejor lenguaje con diferencia y algunos de los trucos de numpy parecen tener una naturaleza demasiado mágica a veces.

Editar: Sé que un bucle for lograría esto, pero realmente estoy buscando entender mejor numpy e idealmente evitar la iteración cuando sea posible para la limpieza del código tanto como la legibilidad.

0
Mythics 4 oct. 2019 a las 20:08

4 respuestas

La mejor respuesta

Podrías hacer lo:

import numpy as np

indices = np.array([0, 1, 1, 0, 0, 1, 0])
values = np.array([1, 2, 3, 4, 5, 6, 7])

result = np.zeros((len(indices), 2))

result[np.arange(len(indices)), indices] = values

print(result)

Salida

[[1. 0.]
 [0. 2.]
 [0. 3.]
 [4. 0.]
 [5. 0.]
 [0. 6.]
 [7. 0.]]

Consulte indexación en numpy.

2
Dani Mesejo 4 oct. 2019 a las 17:13

Puedes usar la multiplicación como abajo

indices_array = np.array([0, 1, 1, 0, 0, 1, 0])
value_array = np.array([1, 2, 3, 4, 5, 6, 7])


## you can simply do this
value_array = np.c_[value_array * (indices_array==0), value_array * (indices_array==1)]
display(value_array)
1
Dev Khadka 4 oct. 2019 a las 17:35

¿Esto funciona para ti?

import numpy as np                                                                                                                                                                     

a = np.array([0, 1, 1, 0, 0, 1, 0])                                                                                                                                                    
b = np.array([1, 2, 3, 4, 5, 6, 7])                                                                                                                                                    

print(np.array([a*b,(1-a)*b]))

[[0 2 3 0 0 6 0]

[1 0 0 4 5 0 7]]

0
yukashima huksay 4 oct. 2019 a las 17:12

Simplemente puede usar column_stack y multiplicar usando la transmisión numpy

i_arr = np.array([0, 1, 1, 0, 0, 1, 0])
v_arr = np.array([1, 2, 3, 4, 5, 6, 7])

np.column_stack((1-i_arr, i_arr)) * v_arr[:,None]

Out[61]:
array([[1, 0],
       [0, 2],
       [0, 3],
       [4, 0],
       [5, 0],
       [0, 6],
       [7, 0]])
0
Andy L. 4 oct. 2019 a las 17:54
58240604