2012-02-24 13 views
12

Normalmente numpy fuerza el lado izquierdo y derecho de una tarea para que coincida, por ejemplo si hago a[:] = b, b debe ser de la misma forma o difusión a la misma forma que a. Pero no parece ser una excepción a esta regla:Numeración de fantasía indexación y asignación

>>> a = np.arange(10) 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b = a.copy() 
>>> a[[0,1,2]] = b[::2] 
>>> a 
array([0, 2, 4, 3, 4, 5, 6, 7, 8, 9]) 
>>> a[np.arange(10)] = b[:2] 
>>> a 
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1]) 

Parece que funciona solamente con matrices 1d y sólo si existe la indexación de lujo en el lado izquierdo de la asignación, pero no he sido capaz de encontrar documentación para este comportamiento en cualquier lugar. ¿Este comportamiento está documentado, si es así, y también puede alguien dar un ejemplo de cuándo podría ser útil?

Actualización:

Parece que el tipo flatiter numpy se comporta de esta manera también, ¿hay alguna conexión entre flatiter e indexación de fantasía que yo no sepa?

>>> a.flat = [10,11] 
>>> a 
array([10, 11, 10, 11, 10, 11, 10, 11, 10, 11]) 
>>> a.flat[:] = [2,3,4] 
>>> a 
array([2, 3, 4, 2, 3, 4, 2, 3, 4, 2]) 
>>> a.flat = range(100) 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
+3

Ha descrito correctamente esta función: solo está permitida cuando se realizan asignaciones en combinación con la indexación avanzada en matrices unidimensionales. Aunque estoy seguro de haber leído sobre esto en los documentos, no puedo encontrar un enlace en este momento. Encontré esto útil de vez en cuando, aunque creo que hubiera sido mejor si esto fuera respaldado por una función dedicada y las asignaciones regulares todavía darían un error. –

+0

Bien, rápidamente asumí que solo estaba transmitiendo pero ahora veo que no cumple con los requisitos para la transmisión. ¡Extraño! – wim

+0

No estoy seguro de si es una característica o un error ... al menos, http://docs.scipy.org/doc/numpy/reference/internals.code-explanations.html#getting-or-setting parece que no mencionar esto como un caso especial. – Tanriol

Respuesta

1

Creo que este comportamiento se basa en R y su antecesor S/S-plus. Así es como funciona la asignación de lista (asignación de "vector") y se llama "reciclaje". El sitio web del proyecto R habla al respecto, pero encontré una explicación más esclarecedora al this link. En R, un vector es una colección de mediciones, por lo que tiene sentido rellenarlo o recortarlo como lo hace. Cuánto de esta lógica ha llegado a numpy, y por qué, sigue siendo una buena pregunta.