Hi, On 1 November 2011 16:28, Aaron Meurer <[email protected]> wrote:
> On Tue, Nov 1, 2011 at 1:27 PM, a.lwtzky <[email protected]> wrote: > > Hi Mateusz, > > > > the second solution is exactly what I was looking for. > > Actually, I tried that as well but ran in the same type error. > > Unfortunately I only tried it with integers, so I gave up hope that it > > works like this. > > Anyway, what's still confusing me is: > >>>> a = Matrix([[1., 2.], [3., 4.]]) > >>>> b = np.array(a, dtype=float) > > > --------------------------------------------------------------------------- > > TypeError Traceback (most recent call > > last) > > > > /home/andy/<ipython console> in <module>() > > > > TypeError: __array__() takes exactly 1 argument (2 given) > > > > I expected it to do exactly the same as array()&astype(), but that's > > obviously wrong. It would be awesome, if it works like that. > > > > Is the bug with the Integers in sympy known? Or should I file a bug > > report for this? > > I didn't find an issue for it. It should be very easy to fix. We > just need to define __long__ on Number, which is similar to __int__ > except it casts the result to a long first. > Yes, that's pretty simple. I wonder why such simple thing doesn't work in SymPy. > > > > > Thank you very much for your help so far. I don't know if this is in > > the scope of sympy, but it would be nice to have a nice interface to > > numpy at this point. > > This is within the scope to some degree. This is why we have > functions like lambdify() for example. > > Aaron Meurer > > > > > Cheers, Andy > > > > > > On 1 Nov., 19:36, Mateusz Paprocki <[email protected]> wrote: > >> Hi, > >> > >> On 1 November 2011 11:26, a.lwtzky <[email protected]> wrote: > >> > >> > Hi Mateusz, > >> > True, but the dtype of this numpy array is object, which is unsuitable > >> > e.g. for numerical ODE solver. > >> > Try: > >> > In [1] : a = Matrix([[1, 2], [3, 4]]) > >> > In [2]: type(a.tolist()[0][0]) > >> > Out[13]: <class 'sympy.core.numbers.One'> > >> > >> > same with the numpy array: > >> > array([[1, 2], > >> > [3, 4]], dtype=object) > >> > >> This is correct behavior. I you want to get a minimal dtype (some sort > of > >> int) then a quick hack is to use lambdify(), e.g.: > >> > >> In [1]: a = Matrix([[1, 2], [3, 4]]) > >> > >> In [2]: f = lambdify((), a, 'numpy') > >> > >> In [3]: f() > >> Out[3]: > >> [[1 2] > >> [3 4]] > >> > >> In [4]: _.dtype > >> Out[4]: int64 > >> > >> f is a zero argument Python's native lambda with NumPy's data types. > >> > >> Downcasting should work and would be a preferred solution, but it fails > due > >> to a bug in SymPy: > >> > >> In [5]: import numpy as np > >> > >> In [6]: b = np.array(a) > >> > >> In [7]: b.astype(int) > >> > --------------------------------------------------------------------------- > >> TypeError Traceback (most recent call > last) > >> /home/mateusz/repo/git/sympy/<ipython-input-7-523ae7d433be> in > <module>() > >> ----> 1 b.astype(int) > >> > >> TypeError: long() argument must be a string or a number, not 'Integer' > >> > >> For some reason NumPy uses long() when int dtype is give and currently > in > >> SymPy: > >> > >> In [8]: int(Integer(10)) > >> Out[8]: 10 > >> > >> In [9]: long(Integer(10)) > >> > --------------------------------------------------------------------------- > >> TypeError Traceback (most recent call > last) > >> /home/mateusz/repo/git/sympy/<ipython-input-9-5db2e38df86b> in > <module>() > >> ----> 1 long(Integer(10)) > >> > >> TypeError: long() argument must be a string or a number, not 'Integer' > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > I've got the pypy version of sympy which is 0.7.1. Has the behavior > >> > anything changed here? > >> > >> > Thanks for your help anyway, > >> > Andy > >> > >> > On 1 Nov., 18:10, Mateusz Paprocki <[email protected]> wrote: > >> > > Hi, > >> > >> > > On 1 November 2011 09:36, a.lwtzky <[email protected]> wrote: > >> > >> > > > Dear everyone, > >> > >> > > > I was wondering if there is a function in sympy that converts a > >> > > > sympy.Matrix to a list of lists of python standard types. For > example > >> > > > if you have > >> > > > >>> m = matrices.Matrix([[2,0],[0,2]]) > >> > >> > > > it would be nice to have a function <f> that returns: > >> > > > >>> res = <f>(m) > >> > > > [[2,0],[0,2]] > >> > > > >>> type(res) > >> > > > list > >> > > > >>> type(res[0][0]) > >> > > > int # or float or whatever seems appropriate. > >> > >> > > > as an alternative: return a 2D numpy array of integers/floats... > But > >> > > > this brings probably unnecessary dependencies to numpy. And if the > >> > > > user really wants to have a numpy.array, he/she could just use > >> > > > np.asarray(res). > >> > >> > > You can create an array from a matrix and convert a matrix to a > list of > >> > > lists, e.g.: > >> > >> > > In [1]: import numpy as np > >> > >> > > In [2]: a = Matrix([[1, 2], [3, 4]]) > >> > >> > > In [3]: a > >> > > Out[3]: > >> > > ⎡1 2⎤ > >> > > ⎢ ⎥ > >> > > ⎣3 4⎦ > >> > >> > > In [4]: a.tolist() > >> > > Out[4]: [[1, 2], [3, 4]] > >> > >> > > In [5]: np.array(a) > >> > > Out[5]: > >> > > [[1 2] > >> > > [3 4]] > >> > >> > > This is for git version of SymPy, but should work for older > versions too. > >> > >> > > > I spent a couple of hours in order to find a (simple) solution for > >> > > > this. > >> > > > A similar idea was presented here: > >> > >> > > > > http://weekinpse.wordpress.com/2010/01/06/how-to-convert-a-sympy-matr. > >> > .. > >> > > > This subject has already been discussed in sympy IRC channel with > >> > > > ronan (thanks again). > >> > >> > > > -> Motivation - Use case > >> > > > I would like to use numpy and sympy in the same project. Use > sympy to > >> > > > solve a ODE system symbolically, get its jacobian, the jacobian's > >> > > > eigenvectors at a critical point and so on. Then use this > information > >> > > > to plot it (with matplotlib) together with other functions, > further > >> > > > investigate it's properties (for example integrate it numerically > with > >> > > > numpy - plot the trajectories) and so on. > >> > >> > > > -> suggestions > >> > > > It doesn't seem to be too bad implementing something like this. > The > >> > > > solution of hdahlol can be found at the link (see above). > >> > > > ronan thought about something like: > >> > > > def <f>(m): > >> > > > arr = np.asarray(map(int, m.mat)) # or float... > >> > > > arr.shape = m.shape > >> > > > return arr > >> > >> > > > But both of us agreed that using m.mat is pretty ugly at this > point. > >> > > > And it does explicitly take use of numpy. Of course there is a > way to > >> > > > copy value by value - but this might result in terribly slow code > >> > > > without benefit. > >> > >> > > > In case a value can't be converted to standard types (for example > a > >> > > > variable x) the function could just throw an exception or leave > the > >> > > > sympy.object in the list and let the user care about this case. > >> > >> > > > I would really appreciate help in this question. > >> > >> > > > Thanks, Andy > >> > >> > > > -- > >> > > > You received this message because you are subscribed to the Google > >> > Groups > >> > > > "sympy" group. > >> > > > To post to this group, send email to [email protected]. > >> > > > To unsubscribe from this group, send email to > >> > > > [email protected]. > >> > > > For more options, visit this group at > >> > > >http://groups.google.com/group/sympy?hl=en. > >> > >> > > Mateusz > >> > >> > -- > >> > You received this message because you are subscribed to the Google > Groups > >> > "sympy" group. > >> > To post to this group, send email to [email protected]. > >> > To unsubscribe from this group, send email to > >> > [email protected]. > >> > For more options, visit this group at > >> >http://groups.google.com/group/sympy?hl=en. > >> > >> Mateusz > > > > -- > > You received this message because you are subscribed to the Google > Groups "sympy" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > [email protected]. > > For more options, visit this group at > http://groups.google.com/group/sympy?hl=en. > > > > > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sympy?hl=en. > > Mateusz -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.
