[Numpy-discussion] Superclassing numpy.matrix: got an unexpected keyword argument 'dtype'

Pierre GM pgmdevlist@gmail....
Wed Dec 10 10:32:50 CST 2008


Robert,
Transforming your matrix to a list before computation isn't very  
efficient. If you do need some extra parameters in your __init__ to be  
compatible with other functions such as asmatrix, well, just add them,  
or use a coverall **kwargs
def __init__(self, instruments, **kwargs)
No guarantee it'll work all the time.

Otherwise, please have a look at:
http://docs.scipy.org/doc/numpy/user/basics.subclassing.html
and the other link at the top of that page. In your case, I'd try to  
put the initialization in the __array_finalize__.



On Dec 10, 2008, at 7:15 AM, <Robert.Conde@sungard.com> <Robert.Conde@sungard.com 
 > wrote:

> Hello,
>
> I'm using numpy-1.1.1 for Python 2.3.  I'm trying to create a class  
> that acts just like the numpy.matrix class with my own added methods  
> and attributes.  I want to pass my class a list of custom  
> "instrument" objects and do some math based on these objects to set  
> the matrix.  To this end I've done the following:
>
> from numpy import matrix
>
> class rcMatrix(matrix):
>    def __init__(self,instruments):
>        """Do some calculations and set the values of the matrix."""
>        self[0,0] = 100 # Just an example
>        self[0,1] = 100 # The real init method
>        self[1,0] = 200 # Does some math based on the input objects
>        self[1,1] = 300 #
>    def __new__(cls,instruments):
>        """When creating a new instance begin by creating an NxN  
> matrix of
>        zeroes."""
>        len_ = len(instruments)
>        return matrix.__new__(cls,[[0.0]*len_]*len_)
>
> It works great and I can, for example, multiply two of my custom  
> matrices seamlessly.  I can also get the transpose.  However, when I  
> try to get the inverse I get an error:
>
>> rcm = rcMatrix(['instrument1','instrument2'])
>> print rcm
> [[ 100.  100.]
> [ 200.  300.]]
>> print rcm.T
> [[ 100.  200.]
> [ 100.  300.]]
>> print [5,10] * rcm
> [[ 2500.  3500.]]
>> print rcm.I
> Traceback (most recent call last):
>  File "[Standard]/deleteme", line 29, in ?
>  File "C:\Python23\Lib\site-packages\numpy\core\defmatrix.py", line  
> 492, in getI
>    return asmatrix(func(self))
>  File "C:\Python23\Lib\site-packages\numpy\core\defmatrix.py", line  
> 52, in asmatrix
>    return matrix(data, dtype=dtype, copy=False)
> TypeError: __init__() got an unexpected keyword argument 'dtype'
>
>
>
> I've had to overwrite the getI function in order for things to work  
> out:
>
>    def getI(self): return matrix(self.tolist()).I
>    I = property(getI, None, doc="inverse")
>
> Is this the correct way to achieve my goals?
>
> Please let me know if anything is unclear.
>
> Thanks,
>
> Robert Conde
>
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion



More information about the Numpy-discussion mailing list