# example for numpy.mgrid doesn't work

Hello! I type in sage notebook 5.8 on my local computer:

import numpy as np
np.mgrid?
....
example:
>>> np.mgrid[-1:1:5j]
array([-1. , -0.5,  0. ,  0.5,  1. ])


But when I type in my notebook:

np.mgrid[-1:1:5j]


and press shift-enter, I get mistake: TypeError: Unable to convert -0.200000000000000*I to float; use abs() or real_part() as desired

It seems to me it's the bug...

edit retag close merge delete

That's the preparser. Well, in Python typically 1j**2 becomes (-1+0j); j is a complex number ala electrical engineering. What surprises me is that numpy would use j for some other purpose.

1

Indeed, in the documentation for mgrid: "However, if the step length is a **complex number** (e.g. 5j)," so basically this is a numpy hack, in my opinion.

Sort by » oldest newest most voted

Sage is interpreting this as complex for some reason. But, np.mgrid[-1:1:0.15] seems to be working for me.

more

In the notebook, the user could also just evaluate all cells in pure Python, if so desired.

You can bypass the Sage preparser by appending r (for raw) to numerical input.

sage: import numpy as np
sage: np.mgrid[-1:1:5jr]
array([-1. , -0.5,  0. ,  0.5,  1. ])


Note that some preparsing is still going on with -1 and 1 which are converted to Sage integers by the preparser before going to numpy's mgrid. If you want to feed numpy's mgrid with raw Python integers:

sage: np.mgrid[-1r:1r:5jr]
array([-1. , -0.5,  0. ,  0.5,  1. ])


It's the same result, except less conversion was done on the way.

On a related note, you can get a Python integer by doing

sage: int(1)


but when you do this, the preparsing stage means what is really done is

int(Integer(1))


so the Python integer 1 is converted to a Sage integer and back to a Python integer.

Bypassing the Sage preparser with

sage: 1r


gets you the Python integer straight away.

more