2013-03-20 5 views
9

注意:私は重複をチェックし、何も明らかに私の質問に答えません。私はあなたが何かを逃したかどうか私に知らせると信じています!SciPy/NumPyインポートガイド

私のコードを整理するために、自分のプログラムでSciPyとNumPyをインポートするための標準的な規則を探していました。私は厳しいガイドラインがないことを知り、私が望むようにそれを行うことができますが、時には矛盾した指示がまだあります。

たとえば、NumPyは配列オブジェクトのみを実装することを意図していますが、SciPyは他のすべての科学アルゴリズム用に用意されています。だからNumPyは配列演算に使うべきですし、SciPyは他のものに使うべきです... SciPyはメインネームスペースのすべてのNumpy関数をインポートします。scipy.array()numpy.array()see this question)と同じものなのでNumPyはSciPyが使用されていないときに使用されます...

SciPyとNumPyを使用する際の推奨方法は何ですか?科学者であるので、sqrt(-1)は複素数を返さなければならないので、私はSciPyだけに行く傾向があります。

は今、私のコードで始まる:

import numpy as np 
from scipy import * 
from matplotlib import pyplot as plt 

私は(例えばnp.zeros()など)アレイの作成/操作のために(例えばlog10()など)数学的操作のためのscipyのダウンロードとnumpyのを使用しています。 SciPyを使い、NumPyを明示的にインポートすることはできないでしょうか?将来のアップデートでNumPyのアレイ操作がSciPyから削除されますか?

+3

これらの関数の変種をscipyからではなく、numpy.lib.scimathから直接取得することをお勧めします。 –

答えて

5

私の代わりに

import numpy as np 
import scipy as sp 

ような何かを行うことをお勧めします。 numpyscipyのような大きなモジュールでは、特にfrom ... import *を実行するのは危険です。以下はその理由を示しています。

>>> any(['foo']) 
True 
>>> from scipy import * 
>>> any(['foo']) 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    any(['foo']) 
    File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 1575, in any 
    return _wrapit(a, 'any', axis, out) 
    File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 37, in _wrapit 
    result = getattr(asarray(obj),method)(*args, **kwds) 
TypeError: cannot perform reduce with flexible type 

ここではどうなりますか?標準のPython組み込み関数anyは、異なる動作を持つscipy.anyに置き換えられています。標準anyを使用するコードはすべて破損する可能性があります。

+0

私は 'from ... import *'の危険性がありますが、scipyとnumpyの両方をインポートすることは冗長です。numpyはscipyに含まれており、scipyは科学計算には優れています。 – PhilMacKay

+0

それから、単に 'scipy'をインポートしますが、' scipy import * 'では' import 'を実行しないでください。 – user763305

+0

私はあなたの答えを選択しました。追加するものはほとんどありません。私の場合、私は常に科学計算を行っているので、 'spipとしてimport scipy 'だけを使ってテストし、全てに' sp.stuff'を使いました。より一般的なコンピューティング環境では、scipyが必要ない場合、numpyが行く方法と思われます。私は両方の魂が同時に必要とされる状況を考えることができません。 – PhilMacKay

0

クラスを作りについて何とあなたが必要とするだけのものを使用し、FX: クラス1:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

クラス2:

import cv2 
import numpy as np 

from pylab import * 
from scipy.cluster.vq import * 
from scipy.misc import imresize 

がクラス3:

import cv2 
import numpy as np 

と最後にオブジェクトを呼び出す場所:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

windows = SIGBWindows(mode="video") 
windows.openVideo("somevideo.avi") 
kmeans(windows) 

あなたが探しているものなのかどうかわかりませんが、この方法ではコードが本当にきれいになり、より多くの機能を簡単に追加できます。

+0

ええと、あなたは何の質問に答えていますか? – MattDMo

+0

うん...それは私が探しているものではありません。私の主な目標は、私のアルゴリズムを簡単に理解できるように他の誰か(または1年間は自分自身)に欲しいので、コードをできるだけ読みやすく、シンプルに保つことです。 – PhilMacKay

+0

私はそれに従っていますが、画像処理には両方の種類の配列が必要なので、この方法でコードを読みやすくするのが最も簡単な方法です。 – jycr753

1

この投稿は2つのモジュール(Relationship between scipy and numpy)に関するいくつかの良い情報を持っています。 Numpyの機能はScipyに完全に含まれるようになっているようですが、いくつかの例外があります(記事を参照)。Scipyには、数学関数、配列などの重要な要素が含まれているため、Scipyを使用するだけで安全です。