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.

>
> 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.

Reply via email to