web-dev-qa-db-ja.com

プログラムで「from__future__import Division」を使用していますが、プログラムにロードされていません

次のプログラムをPython 2で記述して、数学の問題セットに対してニュートン法の計算を行いました。これは完全に機能しますが、私にはわからない理由で、最初に%run -i NewtonsMethodMultivariate.pyを使用してipythonにロードしました。 Python 3除算はインポートされません。これは、Pythonプログラムをロードした後、x**(3/4)と入力すると、「1」になるためです。新しい部門を手動でインポートすると、予想どおりx**(3/4)x**(3/4)のままになります。これはなぜですか?

# coding: utf-8
from __future__ import division
from sympy import symbols, Matrix, zeros

x, y = symbols('x y')
X = Matrix([[x],[y]])
tol = 1e-3

def roots(h,a):
  def F(s):
    return h.subs({x: s[0,0], y: s[1,0]})
  def D(s):
    return h.jacobian(X).subs({x: s[0,0], y: s[1,0]})
  if F(a) == zeros((2,1)):
    return a
  else:
    while (F(a)).norm() > tol:
      a = a - ((D(a))**(-1))*F(a)
      print a.evalf(10)

この問題を回避するためにPython 3を使用しますが、私のLinuxディストリビューションはPython 2。のSymPyのみを出荷します。誰でも提供できるヘルプに感謝します。

また、誰かが疑問に思っている場合に備えて、私はまだnxnヤコビアン用にこのスクリプトを一般化しておらず、問題セットで2x2を処理するだけで済みました。 さらに、コマンドzeros(2,1)を使用する代わりに、2x2のゼロ行列をスライスしています。これは、私のマシンにインストールされているSymPy 0.7.1が、 wiki は別の方法を提案します。たぶん、このコマンドはgitバージョン専用です。 (ゼロ関数の問題を修正した表記を修正してくれたeryksunに感謝します。)

17
Sara Fauzia

ipython -iコマンドとipythonインタープリターのrun -iはどちらも、from __future__ import divisionスクリプトのprint05.pyを無視します。

$ cat print05.py 
from __future__ import division
print(1/2)

ipythonコンソールの場合:

In [1]: print 1/2
0
In [2]: run -i print05.py
0.5
In [3]: division
Out[3]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
In [4]: print 1/2
0
In [5]: from __future__ import division
In [6]: print 1/2
0.5

execfileimportは同じ結果を生成します:

>>> print 1/2
0
>>> execfile('print05.py')
0.5
>>> print 1/2
0
>>> from __future__ import division
>>> print 1/2
0.5

from __future__ import divisionは、異なるモジュールのソースコードに影響を与えないようにする必要があります。そうしないと、その存在を予期しない他のモジュールのコードが破損します。

ここで、from __future__ import divisionは効果があります:

$ python -i print05.py
0.5
>>> print 1/2
0.5
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)

この場合のモジュール名は、__main__内とプロンプト内の両方でprint05.pyです。

ここで、最初のprint 1/2print05モジュールで実行され、2番目は__main__モジュールで実行されるため、期待どおりに機能します。

$ python -im print05
0.5
>>> print 1/2
0

そして、ここに何か問題があります:

$ ipython -i print05.py
0.5
In [1]: division
Out[1]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
In [2]: print 1/2
0

__future__ のドキュメントは次のように述べています。

インタプリタが-iオプションで開始され、実行するスクリプト名が渡され、スクリプトにfutureステートメントが含まれている場合、スクリプトの実行後に開始される対話型セッションで有効になります。

したがって、-iオプションが同じpythonオプション)をエミュレートしようとすると、ipythonのバグになる可能性があります。

12
jfs

SymPyは、futureからの除算のインポートなど、いくつかの一般的なコマンドを実行するIPythonのラッパーであるスクリプト--isympy--も提供します。これは非常に便利であり、新しいIPythonバージョン(0.11以降)では、シンボルの自動構築も可能です(これは私がいつも忘れているように思えます)。 -aパラメーターを指定して実行します。

Python 3については、開発バージョンでサポートされており、次のリリースでサポートされる予定です。ディストリビューションでパックされる時期はわかりません。

0
VPeric