2016-12-20 51 views
1

自分のカスタム関数を、必要なときに呼び出せる別のモジュールに保存します。私の新しい機能の1つはitertoolsを使用していますが、私は名前のエラーを取得し続けています。モジュール内で使用するとitertoolsが定義されていません

NameError: name 'itertools' is not defined 

本当に変です。コンソールでitertoolsをインポートすることはできますが、私の関数を呼び出すと、名前のエラーが発生します。通常、私はライブラリを最初にインポートする限り、他のライブラリ(pandas、sklearnなど)の関数をカスタム関数内で使用できます。

しかし、コンソールにitertoolsをインポートして、私の関数をコピーしてコンソールに貼り付け、関数を呼び出すとうまくいきます。

私は狂っていますが、おそらくモジュールのルールや何かのルールを理解していないと思っています。

ここではモジュールで使用している関数です。それは単にsklearn例の1つからコピーして貼り付けます:

import itertools  
def plot_confusion_matrix(cm, classes, 
           normalize=False, 
           title='Confusion matrix', 
           cmap=plt.cm.Blues): 
     import itertools 
     plt.imshow(cm, interpolation='nearest', cmap=cmap) 
     plt.title(title) 
     plt.colorbar() 
     tick_marks = np.arange(len(classes)) 
     plt.xticks(tick_marks, classes, rotation=45) 
     plt.yticks(tick_marks, classes) 

     if normalize: 
      cm = cm.astype('float')/cm.sum(axis=1)[:, np.newaxis] 
      print("Normalized confusion matrix") 
     else: 
      print('Confusion matrix, without normalization') 

     print(cm) 

     thresh = cm.max()/2. 
     for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): 
      plt.text(j, i, cm[i, j], 
        horizontalalignment="center", 
        color="white" if cm[i, j] > thresh else "black") 

     plt.tight_layout() 
     plt.ylabel('True label') 
     plt.xlabel('Predicted label') 

私は関数内、モジュール内、と私はそれを呼び出していたファイル内でそれをインポートしようとした - すべての運で。私はそれをコンソールでそれをインポートする場合。それがコンソールにインポートされた後でも、私が再び作業しているファイルの中でそれを実行すると、同じエラーが発生します。

+1

同じモジュール内の 'itertools'をインポートするとあなたの関数が有効になります –

+0

itertoolsを使用しているファイルにインポートする必要があります。そのファイルをインポートすると、独自の名前空間があります。 –

+0

モジュールでインポートしようとしましたが、それでもエラーが発生しました。 それを使用しているファイルにインポートしようとしましたが、それでもエラーです。 – Adam

答えて

4

これで動作します。

重要なお知らせ: モジュールを編集する場合は、spyder/ipython/whateverを閉じて再度開く必要があります。単にカーネルをリセットするだけでは不十分です。私の愚か、私は知っているが、おそらくこの答えは誰かの時間を節約するかもしれない。

+0

私は、これで恩恵を受けることができる人は誰でも*見つけられるとは思っていませんが、最高のことを祈りましょう:)私はあなたが最終的にそれを理解してうれしいです。 –

関連する問題