¿Por qué una asignación para las matrices de doble numpy en rodajas no funciona?
-
18-09-2019 - |
Pregunta
¿por qué las siguientes líneas no funcionan como se esperaba?
import numpy as np
a = np.array([0,1,2,1,1])
a[a==1][1:] = 3
print a
>>> [0 1 2 1 1]
# I would expect [0 1 2 3 3]
Es este un 'bug' o hay otra forma recomendada para esto?
Por otro lado, las siguientes obras:
a[a==1] = 3
print a
>>> [0 3 2 3 3]
Saludos, Philipp
Solución
Se le aparece simplemente no se puede hacer una asignación a través de un doble rebanada de esa manera.
Esto funciona sin embargo:
a[numpy.where(a==1)[0][1:]] = 3
Otros consejos
Está relacionado con las obras de indexación forma de fantasía. Hay una explicación detallada aquí . Se hace de esta manera para permitir la modificación in-situ con la indexación de fantasía (es decir a[x>3] *= 2
). Una consecuencia de esto es que no se puede asignar a un doble índice que usted ha encontrado. la indexación de fantasía siempre devuelve una copia en lugar de una vista.
Debido a que el un [a == 1] parte no es en realidad una rebanada. Se crea una nueva matriz. Tiene sentido cuando se piensa en it-- que sólo está tomando los elementos que satisfacen la condición booleano (como una operación de filtro).
Esto hace lo que quiere
a[2:][a[2:]==1]=3