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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top