2009-11-06 5 views

Respuesta

7

Parece que simplemente no puede hacer una tarea a través de una doble rebanada como esa.

Esto funciona sin embargo:

a[numpy.where(a==1)[0][1:]] = 3 
4

Debido a que el de un [a == 1] pieza no es en realidad una rebanada. Crea una nueva matriz. Tiene sentido cuando lo piensas, solo tomas los elementos que satisfacen la condición booleana (como una operación de filtro).

+0

Agregué un segundo ejemplo que funciona como espero. Realmente no veo la diferencia. ¿No debería la tarea ser "transmitida"? –

+2

No creo que esto sea del todo correcto. Si haces 'a [a == 1] = 3', eso realmente cambia el contenido de a. –

+1

@Dave - Creo que esto es perimosocodiae es correcto, y que su contraejemplo se debe a algo más parecido a un truco en las partes internas numpy para crear la apariencia de una operación en el lugar. – tom10

0

Esto hace lo que quiere

a[2:][a[2:]==1]=3 
+1

Pero eso requiere saber de antemano que la primera aparición de 1 es en la posición 1. –

10

Está relacionado con lo impresionante de obras de indexación. Hay una explicación completa here. Se hace de esta manera para permitir la modificación in situ con indexación elegante (es decir, a[x>3] *= 2). Una consecuencia de esto es que no puede asignar un índice doble como lo ha encontrado. La indexación fantástica siempre devuelve una copia en lugar de una vista.

+0

En realidad, su solución modifica la primera aparición de 1, que no es lo que él quiere. –

+0

Derecha, quítelo antes de su comentario. ¡Hola, Felipe, es Robin! – robince

+0

Hola Robin: qué posibilidad hay de que te encuentres aquí ... ¡Saludos de Munich! –

Cuestiones relacionadas