2011-08-12 16 views
5

Standart numpy dizileriyle birlikte çalışabilen bir dizi benzeri nesne uyguluyorum.Sol taraftaki ikili operatör için sayısal zorlama sorunu

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() 

Bu aşağıdaki çıktıyı verir: Ben sadece aşağıdaki şekilde daralır sinir bozucu bir problem isabet ziyade ben umduğu gibi MyArray().__rmul__(array([1,2,3])) çağırmaktan daha Açıkça

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

, __rmul__ her birey için çağrılır dizinin öğesi ve sonuç bir nesne dizisine sarılır. Bu bana python'un coercion rules ile uyumlu değil. Daha da önemlisi, sol çoğalmamı işe yaramaz hale getiriyor.

Bu konuda bir yol biliyor mu?

cevap

1

O numpy bu sorun için basit bir düzeltme sunar çıkıyor

(... Bir __coerce__ kullanarak düzeltmek düşündüm ama bağlantılı belge o biri artık ikili operatörler cevaben çağrılan olduğunu açıklar) . Aşağıdaki kod amaçlandığı gibi çalışır.

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

Daha fazla bilgi here bulunabilir.

İlgili konular