2011-08-12 17 views
5

Estoy implementando un objeto tipo array que debería ser interoperable con matrices numpy estándar. Me acaba de golpear un problema molesto que se reduce a lo siguiente:problema de coacción numpy para el operador binario del lado izquierdo

class MyArray(object): 
    def __rmul__(self, other): 
    return MyArray() # value not important for current purpose 

from numpy import array 
print array([1,2,3]) * MyArray() 

Esto produce el siguiente resultado:

[<__main__.MyArray instance at 0x91903ec> 
<__main__.MyArray instance at 0x919038c> 
<__main__.MyArray instance at 0x919042c>] 

Es evidente que, en lugar de llamar a MyArray().__rmul__(array([1,2,3])) como esperaba, __rmul__ se llama para cada individuo elemento de la matriz, y el resultado envuelto en una matriz de objetos. Esto me parece no conforme con python's coercion rules. Más importante aún, hace que mi multiplicación de la izquierda sea inútil.

¿Alguien sabe una forma de evitar esto?

(pensé que una podría fijarla con __coerce__ pero el documento vinculado explica que que uno ya no es invocada en respuesta a los operadores binarios ...)

Respuesta

1

Resulta que numpy ofrece una solución sencilla para este problema . El siguiente código funciona según lo previsto.

class MyArray(object): 
    __array_priority__ = 1. # <- fixes the problem 
    def __rmul__(self, other): 
    return MyArray() 

Más información se puede encontrar here.

Cuestiones relacionadas