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.

Reply via email to