1. ホーム
  2. パイソン

[解決済み】SciPyとNumPyの関係

2022-04-03 14:45:18

質問

SciPyはNumPyの関数のほとんど(すべてではない[1])を独自の名前空間で提供しているようです。言い換えれば、もし numpy.foo があれば、ほぼ間違いなく scipy.foo . ほとんどの場合、この2つは全く同じに見え、時には同じ関数オブジェクトを指していることさえあります。

時には、異なることもあります。最近出てきた例を挙げますと

  • numpy.log10 ユーファンク は、負の引数に対してNaNを返します。
  • scipy.log10 は負の引数に対して複素数を返し、ufunc ではないようです。

についても同じことが言えます。 log , log2logn についてではなく log1p [2].

一方 numpy.expscipy.exp は、同じ ufunc に対して異なる名前であるように見えます。これは scipy.log1pnumpy.log1p .

別の例として numpy.linalg.solvescipy.linalg.solve . 両者は似ていますが、後者は前者よりいくつかの追加機能を備えています。

なぜ重複しているように見えるのか?もし、これが numpyscipy という名前空間がありますが、なぜ微妙に動作が違ったり、関数がなかったりするのでしょうか?この混乱を解消するための包括的なロジックはあるのでしょうか?

[1] numpy.min , numpy.max , numpy.abs に対応するものがありません。 scipy 名前空間を使用します。

[2] NumPy 1.5.1 と SciPy 0.9.0rc2 を使ってテストしています。

どのように解決するのですか?

前回確認したところ、scipyの __init__ メソッドが実行されます。

from numpy import *

scipyモジュールがインポートされたときに、numpyの名前空間全体がscipyに含まれるようにするためです。

log10 の動作は興味深いものです。 どちらも のバージョンはnumpyから来ています。一方は ufunc もうひとつは numpy.lib 関数を使用します。なぜscipyはライブラリ関数よりも ufunc というのも、私の頭ではわからないのです。


編集部:実は、答えられるのは log10 の質問をします。scipyの中を見ると __init__ メソッドを見ると、こんな感じです。

# Import numpy symbols to scipy name space
import numpy as _num
from numpy import oldnumeric
from numpy import *
from numpy.random import rand, randn
from numpy.fft import fft, ifft
from numpy.lib.scimath import *

log10 は、scipy で取得した関数に由来します。 numpy.lib.scimath . そのコードを見ると、こう書いてある。

"""
Wrapper functions to more user-friendly calling of certain math functions
whose output data-type is different than the input data-type in certain
domains of the input.

For example, for functions like log() with branch cuts, the versions in this
module provide the mathematically valid answers in the complex plane:

>>> import math
>>> from numpy.lib import scimath
>>> scimath.log(-math.exp(1)) == (1+1j*math.pi)
True

Similarly, sqrt(), other base logarithms, power() and trig functions are
correctly handled.  See their respective docstrings for specific examples.
"""

の numpy の基本的な ufuncs をオーバーレイするモジュールのようです。 sqrt , log , log2 , logn , log10 , power , arccos , arcsin および arctanh . これであなたが見ている動作が説明できます。なぜこのような動作をするのかという根本的な設計理由は、おそらくどこかのメーリングリストの投稿に埋もれているはずです。