Ask Your Question

example for numpy.mgrid doesn't work

asked 2013-05-03 04:39:59 +0200

AndreWin gravatar image

updated 2019-06-27 07:40:07 +0200

slelievre gravatar image

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

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

But when I type in my notebook:


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

kcrisman gravatar imagekcrisman ( 2013-05-03 11:51:27 +0200 )edit

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.

kcrisman gravatar imagekcrisman ( 2013-05-03 11:51:57 +0200 )edit

2 Answers

Sort by ยป oldest newest most voted

answered 2013-05-03 10:42:37 +0200

calc314 gravatar image

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

edit flag offensive delete link more


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

kcrisman gravatar imagekcrisman ( 2013-05-03 11:53:00 +0200 )edit

answered 2013-05-07 05:11:14 +0200

slelievre gravatar image

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


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.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools


Asked: 2013-05-03 04:39:59 +0200

Seen: 1,501 times

Last updated: Jun 27 '19