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.