Hi

W dniu wtorek, 3 września 2013 21:12:23 UTC+2 użytkownik Mateusz Paprocki 
> napisał:
>>
>> Hi, 
>>
>> On 3 September 2013 13:38, Wojciech Czaja 
>> <[email protected]<javascript:>> 
>> wrote: 
>> > 
>> > When I create Matrix calling g (gclass object) 
>> > I get KeyError but calling g directly I do not 
>> > 
>> > Any idea? 
>> > 
>>
>> For some, yet unknown to me, reason Matrix constructor converts first 
>> component to a SymPy object, so (1, 1) get converted to (Integer(1), 
>> 1).
>
>
You are right
map(int, idxs) temporarily fix this

from sympy import *
class gclass(object):
    def __init__(self):
        self.components = {} 
    def __call__(self, *idxs):
        idxs = tuple(map(int, idxs))
        if idxs in self.components.keys():
            return self.components[idxs]
        else:
            component = sum(idxs)
            self.components.update({idxs: component})
            return component

g = gclass()
g(1, 1)
Matrix(4,4, lambda i,j: g(i, j))

Out[1]:

Matrix([
[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]])

Your code works without issuing g(1, 1) before Matrix(4, 4, ...).
>
>
but each subsequent call of g() in Matrix() gives the same error
 

>
>> Try not to mix different types within one instance of gclass and 
>> you'll be fine. 
>
>
I don't know what you mean
 

> This strange behavior seems a bug to me, but there 
>> might be some reason to do this. 
>>
>> Example: 
>>
>> In [1]: %paste 
>> class gclass(object): 
>>     def __init__(self): 
>>         self.components = {} 
>>     def __call__(self, *idxs): 
>>         if idxs in self.components.keys(): 
>>             return self.components[idxs] 
>>         else: 
>>             component = sum(idxs[i] for i in range(len(idxs))) 
>>             self.components.update({idxs: component}) 
>>             return component 
>> ## -- End pasted text -- 
>>
>> In [2]: g = gclass() 
>>
>> In [3]: Matrix(4, 4, lambda i, j: g(i, j)) 
>> Out[3]: 
>> ⎡0  1  2  3⎤ 
>> ⎢          ⎥ 
>> ⎢1  2  3  4⎥ 
>> ⎢          ⎥ 
>> ⎢2  3  4  5⎥ 
>> ⎢          ⎥ 
>> ⎣3  4  5  6⎦ 
>>
>> In [4]: g(1, 1) 
>> --------------------------------------------------------------------------- 
>>
>> KeyError                                  Traceback (most recent call 
>> last) 
>> <ipython-input-4-3733e998b6af> in <module>() 
>> ----> 1 g(1, 1) 
>>
>> <ipython-input-1-f4d7dee41d32> in __call__(self, *idxs) 
>>       4     def __call__(self, *idxs): 
>>       5         if idxs in self.components.keys(): 
>> ----> 6             return self.components[idxs] 
>>       7         else: 
>>       8             component = sum(idxs[i] for i in range(len(idxs))) 
>>
>> KeyError: (1, 1) 
>>
>> In [5]: g.components 
>> Out[5]: 
>> {(0, 0): 0, (0, 1): 1, (0, 2): 2, (0, 3): 3, (1, 0): 1, (1, 1): 2, (1, 
>> 2): 3, (1, 3): 4, (2, 0): 2, (2, 1): 3, (2, 2): 4, (2, 3): 5, (3, 0) 
>> : 3, (3, 1): 4, (3, 2): 5, (3, 3): 6} 
>>
>> In [6]: (1, 1) in g.components 
>> Out[6]: False 
>>
>> In [7]: (Integer(1), 1) in g.components 
>> Out[7]: True 
>>
>> btw. sum(idxs[i] for i in range(len(idxs))) can be simplified to 
>> sum(idxs) because you can iterate over tuples in Python. 
>>
>
yea thanks 
 

> > class gclass(object): 
>> >     def __init__(self): 
>> >         self.components = {} 
>> >     def __call__(self, *idxs): 
>> >         if idxs in self.components.keys(): 
>> >             return self.components[idxs] 
>> >         else: 
>> >             component = sum(idxs[i] for i in range(len(idxs))) 
>> >             self.components.update({idxs: component}) 
>> >             return component 
>> > 
>> > g = gclass() 
>> > g(1, 1) 
>> > print g(1, 1) 
>> > Matrix(4,4, lambda i,j: g(i, j)) 
>> > 
>> > 
>> --------------------------------------------------------------------------- 
>> > KeyError                                  Traceback (most recent call 
>> last) 
>> > <ipython-input-50-17a658aa0dab> in <module>() 
>> >      13 g(1, 1) 
>> >      14 print g(1, 1) 
>> > ---> 15 Matrix(4,4, lambda i,j: g(i, j)) 
>> > 
>> > /usr/local/lib/python2.7/dist-packages/sympy/matrices/dense.pyc in 
>> > __new__(cls, *args, **kwargs) 
>> >     606 
>> >     607     def __new__(cls, *args, **kwargs): 
>> > --> 608         return cls._new(*args, **kwargs) 
>> >     609 
>> >     610     def as_mutable(self): 
>> > 
>> > /usr/local/lib/python2.7/dist-packages/sympy/matrices/dense.pyc in 
>> _new(cls, 
>> > *args, **kwargs) 
>> >     598     @classmethod 
>> >     599     def _new(cls, *args, **kwargs): 
>> > --> 600         rows, cols, flat_list = 
>> cls._handle_creation_inputs(*args, 
>> > **kwargs) 
>> >     601         self = object.__new__(cls) 
>> >     602         self.rows = rows 
>> > 
>> > /usr/local/lib/python2.7/dist-packages/sympy/matrices/matrices.pyc in 
>> > _handle_creation_inputs(cls, *args, **kwargs) 
>> >     146             for i in range(rows): 
>> >     147 
>> > flat_list.extend([cls._sympify(operation(cls._sympify(i), j)) 
>> > --> 148                     for j in range(cols)]) 
>> >     149 
>> >     150         # Matrix(2, 2, [1, 2, 3, 4]) 
>> > 
>> > <ipython-input-50-17a658aa0dab> in <lambda>(i, j) 
>> >      13 g(1, 1) 
>> >      14 print g(1, 1) 
>> > ---> 15 Matrix(4,4, lambda i,j: g(i, j)) 
>> > 
>> > <ipython-input-50-17a658aa0dab> in __call__(self, *idxs) 
>> >       4     def __call__(self, *idxs): 
>> >       5         if idxs in self.components.keys(): 
>> > ----> 6             return self.components[idxs] 
>> >       7         else: 
>> >       8             component = sum(idxs[i] for i in range(len(idxs))) 
>> > 
>> > KeyError: (1, 1) 
>> > 
>> > 2 
>> > 
>> > 
>> > -- 
>> > You received this message because you are subscribed to the Google 
>> Groups 
>> > "sympy" group. 
>> > To unsubscribe from this group and stop receiving emails from it, send 
>> an 
>> > email to [email protected] <javascript:>. 
>> > To post to this group, send email to [email protected]<javascript:>. 
>>
>> > Visit this group at http://groups.google.com/group/sympy. 
>> > For more options, visit https://groups.google.com/groups/opt_out. 
>>
>> Mateusz 
>>
>
Thanks for your help

Wojtek 

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to