Python 为什么获取名称错误:未定义名称“array”
我使用spyder并编写了以下类:Python 为什么获取名称错误:未定义名称“array”,python,nameerror,spyder,Python,Nameerror,Spyder,我使用spyder并编写了以下类: class Ray: def __init__(self, r, p, k): if r.shape == (3,): self.r = r if p.shape == (3,): self.p = p if k.shape == (3,): self.k = k r = array(range(3)) p = array(ra
class Ray:
def __init__(self, r, p, k):
if r.shape == (3,):
self.r = r
if p.shape == (3,):
self.p = p
if k.shape == (3,):
self.k = k
r = array(range(3))
p = array(range(3))
k = array(range(3))
它存储在/home/user/workspace/spyder/project中,控制台工作目录就是这个目录。在控制台中,我可以运行arrayrange3,它返回一个值为0,1,2的数组。但是在做
import ray
我得到以下错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ray.py", line 8, in <module>
class Ray:
File "ray.py", line 20, in ray
r = array(range(3));
NameError: name 'array' is not defined
您需要从numpy导入数组中获取
这是由Spyder控制台为您完成的。但在程序中,必须进行必要的导入;例如,您的程序可以由没有Spyder的人运行
我不确定Spyder默认为您导入了什么。数组可以通过从pylab导入*导入,也可以等效地通过从numpy导入*。如果要将代码从Spyder控制台直接复制到程序,可能需要从numpy import*甚至从pylab import*进行复制。但是,这会污染程序的名称空间;通常先将numpy导入为np,然后再导入np.array…。您需要从numpy导入数组
这是由Spyder控制台为您完成的。但在程序中,必须进行必要的导入;例如,您的程序可以由没有Spyder的人运行
我不确定Spyder默认为您导入了什么。数组可以通过从pylab导入*导入,也可以等效地通过从numpy导入*。如果要将代码从Spyder控制台直接复制到程序,可能需要从numpy import*甚至从pylab import*进行复制。但是,这会污染程序的名称空间;按照惯例,先导入numpy,然后导入np.array…。您会错过一些导入。旁注:为了遵循PEP 8,我用大写字母开头了您的类名,我在_init________参数之间加了空格。我也删除了不必要的结尾;让雷成为一个新的班级。那是在你再次编辑之前。您可能想考虑将我的改进放回原处。Pylab导入的注释是错误的:它是从NUMPY导入*内部的。您错过了一些导入。请注意:为了遵循PEP 8,我用大写字母开头您的类名,我在y-In ITITY参数之间放置空格。我也删除了不必要的结尾;让雷成为一个新的班级。那是在你再次编辑之前。您可能想考虑将我的改进放回原处。来自PyLabIPub的注释是错误的:它是从NUMPY导入*内部编辑的。但我感到困惑的是,既然spyder已经进口了numpy,为什么它不起作用?另外,如果我使用np.array而不是array,也没有什么区别。在执行import numpy之后,您可以使用numpy.array、no array访问array函数。从pylab import*执行后,您有一个新的导入数组,它与NumPy的数组==NumPy.array返回True完全相同。好的,我很困惑。如果我在脚本中的任何一点将import numpy添加为np,似乎都没有问题。如果我打开一个python解释器,以np的形式运行import numpy,然后复制粘贴代码,它就可以正常工作了。但是,如果我将numpy作为np导入,然后从ray导入*返回一个错误?好的,我想我已经解决了。。基本上每个模块都需要导入一些东西。。。如果我错了,请纠正我..是的,每个模块都有自己的名称空间。因此,如果希望在模块中定义数组,则需要在模块内部定义它,例如,可以使用from numpy import array,或者在导入numpy之后使用numpy.array。这种导入所有必要模块的方法的优点是,它使每个模块独立。相同的模块可用于许多不同的项目,而不必考虑项目的其他部分是否导入了所需的对象。编辑答案以显示spyder默认导入的内容。但我感到困惑的是,既然spyder已经进口了numpy,为什么它不起作用?另外,如果我使用np.array而不是array,也没有什么区别。在执行import numpy之后,您可以使用numpy.array、no array访问array函数。从pylab import*执行后,您有一个新的导入数组,它与NumPy的数组==NumPy.array返回True完全相同。好的,我很困惑。如果我在脚本中的任何一点将import numpy添加为np,似乎都没有问题。如果我打开一个python解释器,以np的形式运行import numpy,然后复制粘贴代码,它就可以正常工作了。但是,如果我将numpy作为np导入,然后从ray导入*返回一个错误?好的,我想我已经解决了。。基本上每个模块都需要导入一些东西。。。如果我错了,请纠正我..是的,每个模块都有自己的名称空间。因此,如果希望在模块中定义数组,则需要在模块内部定义它,例如,可以使用from numpy import array,或者在导入numpy之后使用numpy.array。这种导入所有必要模块的方法的优点是,它使每个模块独立,并且可以使用相同的模块 在许多不同的项目中,不必考虑项目的其他部分是否导入了所需的对象。
import numpy as np # NumPy (multidimensional arrays, linear algebra, ...)
import scipy as sp # SciPy (signal and image processing library)
import matplotlib as mpl # Matplotlib (2D/3D plotting library)
import matplotlib.pyplot as plt # Matplotlib's pyplot: MATLAB-like syntax
from mayavi import mlab # 3D plotting functions
from pylab import * # Matplotlib's pylab interface
ion() # Turned on Matplotlib's interactive mode
Within Spyder, this intepreter also provides:
* special commands (e.g. %ls, %pwd, %clear)
* system commands, i.e. all commands starting with '!' are subprocessed
(e.g. !dir on Windows or !ls on Linux, and so on)