名称错误:全局名称'numpy'未定义

7

我正在尝试通过收集essentia(一种MIR库)的函数来编写特征提取器。

流程图如下:单个特征提取,池化,PoolAggregator,使用np.concatenate连接以形成来自poolAggregator的整个特征列表。

即使没有导入numpy,在ipython笔记本下脚本也可以正常运行。 我只是将从上一个阶段得到的数组或浮点数聚合起来,但错误消息显示:"NameError: global name 'numpy' is not defined"

我已经尝试在模块顶部放置“import numpy as np”:

import numpy as np
def featureExtractor(path):

或者在函数中:
def featureExtractor(path):
    import numpy as np

或者在主文件中的模块外部:

import numpy as np
from featureExtractor import featureExtractor

这些都不能解决问题,请帮助我。

以下是脚本:

from essentia.standard import *
import essentia

def featureExtractor(path):
    loader = MonoLoader(filename = path)
    x = loader()

    pool = essentia.Pool()
    spectrum = Spectrum()
    w = Windowing(type = 'hann')
    # Create needed objects
    mfcc = MFCC()
    centroid = Centroid()

    for frame in FrameGenerator(x, frameSize = 1024, hopSize = 512):    

        mfcc_bands, mfcc_coeffs = mfcc(spectrum(w(frame))) # output: vector_real
        spec_centroid = centroid(spectrum(w(frame))) # output: real

        pool.add('lowlevel.mfcc', mfcc_coeffs)
        pool.add('lowlevel.centroid', spec_centroid)

    aggrPool = PoolAggregator(defaultStats = [ 'mean', 'var' ])(pool) 
    # calculate mean and var for each feature

    # build a feature vector of type array
    list = ['lowlevel.centroid.mean', 'lowlevel.centroid.var',
            'lowlevel.mfcc.mean', 'lowlevel.mfcc.var']

    feature_vec = []

    for name in list:
        feature = aggrPool[name]
        if type(feature) != float:  # for those type == array
           feature_vec = np.concatenate([feature_vec,feature], axis = 0)
        else: # for those type == float
           feature_vec.append(feature)
    return feature_vec

然后我在主文件中输入以下命令:

path = "/~/Downloads/~.wav"
from featureExtractor import featureExtractor
featureExtractor(path)

我遇到了一个错误:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-109-40b5bbac9b17> in <module>()
      1 from featureExtractor import featureExtractor
      2 
----> 3 featureExtractor(path)

/~/ipython_notebook/featureExtractor.py in featureExtractor(path)
     66         for name in list:
     67                 feature = aggrPool[name]
---> 68         if type(feature) != float:  # for those type == array
     69                 feature_vec = np.concatenate([feature_vec,feature], axis = 0)
     70         else: # for those type == float

NameError: global name 'numpy' is not defined

无论我把指令放在哪里,都会收到相同的错误提示(如上所述)。
import numpy as np

5
你是否安装了NumPy? - EdChum
5
请将代码简化到最少运行状态,包括 import numpy as np 一行,并在运行时产生错误。然后发布剩下的代码。此外,请发布完整的堆栈跟踪信息以生成您精简版本代码所产生的错误。否则,我们将不得不查看您的情况的各个方面并猜测这些部分如何组合。 - user2357112
1
这可能意味着你的ipython环境已经安装了numpy,但是你的命令行环境没有安装。如果你尝试运行一个只有 import numpy 的脚本,它能够正常运行吗?你需要将numpy安装到你的python环境中。 - EdChum
不确定是否有打字错误,但我再次运行并确认了错误。它是 featureExtractor.py - Francis
那个堆栈跟踪毫无意义。它指向的行根本没有使用名称“numpy”。 - user2357112
显示剩余7条评论
1个回答

16

只需简单尝试。

import numpy

在文件 /~/ipython_notebook/featureExtractor.py 的顶部

看起来你的代码期望的模块名称是 numpy,而不是 np


如果你没有安装numpy,你将会得到一个ImportError错误。 - Pierre de Buyl
1
你可以在IPython中让它工作,而在普通的Python解释器中不能,这很奇怪。你有自定义安装吗? - Pierre de Buyl
2
另外,你重置了 IPython 的内核吗?否则,你可能有一些“残留”的导入。 - Pierre de Buyl
3
重启内核可以解决问题!我原本以为只有featureExtractor.py模块中的脚本会影响结果,没想到重新启动内核可以解决问题!非常感谢。所以我在模块顶部加上了import numpy as np,重启内核后它就起作用了。我原本认为重新启动只相当于Matlab中的clear all - Francis
1
Python(和IPython)在没有重新启动的情况下不会重新加载模块(虽然有方法可以解决,但并不实用)。 - Pierre de Buyl
我以为重新运行单元格可以重新加载模块。我明白了,谢谢。 - Francis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接