# 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

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

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.