Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why isn't arange defined?

Tags:

python

I have no programming experience and am learning Python for a class. I'm going through conditionals now and have a problem that I'm not understanding the cause of.

I'm basically just trying to let someone plot x^2 within a desired interval of x with the restriction that x isn't negative. If the user inputs a negative input, they'll get a message saying it's not allowed. Otherwise, x vs. x^2 should be plotted.

N = input('Enter upper limit of x:');
if N < 0:
    print "Negative input isn't allowed."
else:
    x = arange(N)
    y = x*x
    plot(x,y) 

The above gives me the error:

NameError: name 'arange' is not defined 

Which I don't understand because arange() is normally defined from my (very little) understanding.

like image 879
BRamses Avatar asked Jan 31 '15 21:01

BRamses


2 Answers

Python has a lot of built in commands. However, arange and plot are not some of them. These are provided by numpy and matplotlib.

To get your code to work, you could add:

from numpy import *
from matplotlib import *

at the top of your code. This isn't the recommended way though. It's better to do:

import numpy
import matplotlib

and then when you call their functions

x=numpy.arange(N)

and

matplotlib.plot(x,y)

The reason that this is recommended is sometimes you may have other modules that have the same function names.

A (very) slightly more advanced version that is even better is like:

import numpy as np
import matplotlib.pyplot as plt
x=np.arange(N)
plt.plot(x,y)

np is a standard abbreviation for numpy and plt is a standard abbreviation of matplotlib.pyplot (which is where the command plot is actually defined). These are the standard abbreviations, and importing just part of matplotlib is good for reducing overhead.

You should read up on what a numpy array is versus a usual python list.

like image 124
Joel Avatar answered Sep 22 '22 16:09

Joel


Have you been exposed to python through the ipython interactive shell? with ipython it is still possible to use the deprecated command line switch -pylab that exposes to the user the matplotlib interactive commands from the matplotlib.pyplot module and all the numpy library.

When you bring these habits in writing your first python program you will find that things are more complicated...

You have essentially two solutions, the first one is

from pylab import *
...

that allows you to call unqualified function names like arange and plot from your script and, second one

import numpy as np
import matplotlib.pyplot as plt
# ...
x = np.arange(N)
# ...
plt.plot(x, x*x)

even if the second possibility is more verbose than the first, it is the recommended avenue: unqualified imports are considered bad practice because they pollute the namespace of your script, and this is particularly true with large modules like matplotlib.pyplot and numpy that defines hundreds of names!

Re the names used for the imports, that is np and plt, these choices are a sort of best practice agreement that you'd be wise to adopt, as you'll find on the net and on SO 1000's of examples that use exactly these names to access the plotting and numerical libraries.

To summarize, using

import numpy as np
import matplotlib.pyplot as plt

is a so common idiom that it is what I advice you to do.

like image 34
gboffi Avatar answered Sep 18 '22 16:09

gboffi