NameError: 全局名称'numpy'未定义

7 投票
1 回答
80256 浏览
提问于 2025-04-18 16:48

我正在尝试写一个特征提取器,主要是用到essentia这个音乐信息检索库的功能。整个流程大概是这样的:先提取单个特征,然后把这些特征放到一个池子里,接着用PoolAggregator来聚合这些特征,最后用np.concatenate把池子里的特征合并成一个完整的特征列表。

这个脚本在ipython notebook里运行得很好,甚至不需要导入numpy。 我只是把从前一个步骤得到的数组或浮点数聚集在一起,但却出现了错误信息:"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

1 个回答

16

试试这样做

import numpy

在文件 /~/ipython_notebook/featureExtractor.py 的顶部加上这段代码

看起来你的代码是期待用 numpy 这个模块名,而不是 np

撰写回答