SciPy와 NumPy의 관계


254

SciPy는 자체 네임 스페이스에서 NumPy의 기능 중 대부분 (1 개는 아님)을 제공하는 것으로 보입니다. 다시 말해,라는 이름의 함수가 있다면 numpy.foo거의 확실하게가 scipy.foo있습니다. 대부분의 경우 두 개는 정확히 같은 것으로 보이고 때로는 같은 함수 객체를 가리키는 경우도 있습니다.

때때로 그들은 다릅니다. 최근에 나온 예제를 제공하려면 :

  • numpy.log10부정적인 인수에 대해 NaN을 반환 하는 ufunc 입니다.
  • scipy.log10 음수 인수에 대한 복소수 값을 반환하며 ufunc가 아닌 것으로 보입니다.

동일한 약 말할 수 log, log2logn아니지만 대해 log1p[2].

반면에, numpy.expscipy.exp같은 ufunc 다른 이름이 될 것으로 보인다. 이것은 또한 사실이다 scipy.log1p하고 numpy.log1p.

또 다른 예는 numpy.linalg.solvevs scipy.linalg.solve입니다. 그것들은 비슷하지만 후자는 전자에 비해 몇 가지 추가 기능을 제공합니다.

왜 명백한 복제인가? 이것이 네임 스페이스 numpy로의 도매 수입 scipy일 경우, 왜 동작과 누락 된 기능의 미묘한 차이점이 있습니까? 혼란을 해결하는 데 도움이되는 중요한 논리가 있습니까?

[1] numpy.min, numpy.max, numpy.abs그리고 몇 가지 다른이의 더 대응이없는 scipy네임 스페이스를.

[2] NumPy 1.5.1 및 SciPy 0.9.0rc2를 사용하여 테스트했습니다.


7
나는 그 답을 읽을 수 all of those functions are available without additionally importing Numpy있기 때문에 the intention is for users not to have to know the distinction between the scipy and numpy namespaces. 이제는 numpy 및 scipy에 대한 게시물을 따르고 직접 사용하기 때문에 궁금합니다. 그리고 거의 항상 numpy가 np로 별도로 수입되는 것을 볼 수 있습니다. 그래서 그들은 실패 했습니까?
joris 2016 년

8
scipy와 NumPy와 사이에 약간의 차이가 FFT 물건에, 내가 한 번 결국 scipy 및 rfft의 NumPy와의 버전이 다르게 정의 아래로 추적한다는 문제에 물린있어되어있다
WIM

1
SciPy와 NumPy의 FFT는 다릅니다. SciPy는 Fortran 라이브러리 FFTPACK을 사용하므로 이름은 scipy.fftpack입니다. NumPy는 fftpack_lite라는 C 라이브러리를 사용합니다. NumPy에서는 기능이 적고 배정도 만 지원합니다. 열성 fftpack_lite 대신 FFT에 Intel MKL을 사용하도록 numpy.fft를 패치했습니다.
Sturla Molden

7
NumPy는 원래 이름이 scipy.core입니다. NumPy와 SciPy는 밀접한 관련이있는 프로젝트입니다. 분리의 주된 이유는 대량의 SciPy가 항상 필요한 것은 아니기 때문에 어레이 라이브러리 (NumPy)가 희박하고 의미가 있는지 확인하는 것입니다. 또한 과학자들은 scipy.core를 위해 배열 패키지 숫자 (MIT)와 numarray (NASA)를 폐기하기로 결정했으며 NumPy라는 이름을 얻었습니다. SciPy는 여전히 1.0에 도달하지 못했지만 NumPy는 현재 1.8.1로 출시되었습니다. NumPy에는 FFT 및 선형 대수를위한 몇 가지 기능이 있지만 SciPy만큼 광범위하지는 않습니다.
Sturla Molden

@SturlaMolden Enthought에 대해 알아두면 좋을 것입니다. Anaconda가 둘 다 또는 단지 numpy를 최적화하는지 알고 있습니까?
dashesy

답변:


138

내가 마지막으로 확인했을 때, scipy __init__메소드는

from numpy import *

scipy 모듈을 가져올 때 전체 numpy 네임 스페이스가 scipy에 포함되도록합니다.

log10때문에 당신이 설명하는 동작은, 재미 버전이 NumPy와에서오고있다. 하나는 a 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. 그것은 당신이보고있는 행동을 설명합니다. 그렇게 만들어진 기본 디자인 이유는 아마도 메일 링리스트 포스트에 묻혀있을 것입니다.


10
NumPy는 파이썬에서 그러한 객체를 필요로하는 누군가가 사용할 수 있도록 숫자 배열을위한 라이브러리가 될 것입니다. SciPy는 과학자 / 엔지니어를위한 라이브러리이기 때문에 좀 더 엄격한 이론적 수학 (복잡한 버전의 log10 등 포함)을 목표로합니다. NumPy가 SciPy / NumPy 사이의 경계가 오늘날처럼 명확하지 않은 시점에 포함 된 많은 오래된 하위 모듈 (Scipy로 이동해야 함)을 유지한다는 사실에 혼란이 생깁니다.
PhilMacKay

@ PhilMacKay 안녕하세요 Phil, 2013 년 부터이 numpy / scipy 질문과 관련된이 게시물과 다른 게시물을 읽었습니다. 위의 의견에 잘 나와있는 것처럼 귀하의 의견이 여전히 최신인지 여부는 제 질문입니다. 나는 포스터가 scipy에 비 동등 물이 있다고 말하고 abs, max 및 min을 예제로 나열하지만 abs는 numpy.absolute의 별칭이며 scipy.absolute, scipy.maximum 및 scipy가 있음을 이해합니다 .최저한의. 당신의 경험에서 지금까지 이미 scipy가 필요하다면 numpy를 가져와야 했습니까?
Dan Boschen

@PhilMacKay 일반적인 합의는 SciPy의 서브 모듈 라이브러리를 관련 사용 사례에 사용하고 핵심 NumPy 작업에서 NumPy를 특별히 가져 오는 것입니다 (SciPy의 최상위 레벨 대신 가져 오기해야 함) ). 어떤 이유로 이것은 SciPy 문서뿐만 아니라 다른 사람들이 더 나은 코딩 방법으로 언급하고 있으며 이것이 왜 중요한지 이해하려고합니다. 나는 그것이 관습의 문제이기 때문에 가독성이라고 가정합니다. 당신의 현재 의견은 무엇입니까?
Dan Boschen

@ DanBoschen 2018 년 11 월 현재 위의 의견이 여전히 있습니다. NumPy 만 필요할 때 SciPy를 가져 오는 것은 약간 과잉 일 수 있습니다. 반면 SciPy가로드되면 NumPy를 가져 오므로 SciPy 외에 NumPy를 가져올 필요가 없습니다. 물론 문서를 따르는 것에 대한 좋은 주장이 있으므로 자신의 상황에서 가장 관련성이 높은 것을 자유롭게 수행하십시오.
PhilMacKay

@PhilMacKay 입력 해 주셔서 감사합니다. 내 생각을 통해 numpy를 가져 오는 것이 왜 좋습니다 (모든 것을 scipy에서 수행 할 수 있음에도 불구하고) 관습과 공유 코드의 가독성 문제입니다. 모든 numpy 특정 코드가 numpy 라이브러리에 구체적으로 연결되어 있으면 더 큰 scipy 라이브러리에 연결되는 것이 더 쉬워 질 수 있습니다. 그것은 내 생각에 (내 자신의 접근 방식으로) numpy를 가져온 다음 최상위 수준의 scipy를 가져 오는 것이 아니라 필요에 따라 scipy 하위 패키지 만 가져 오는 것입니다.
Dan Boschen

52

SciPy 참조 안내서에서 :

... 모든 Numpy 함수는 scipy 네임 스페이스 에 포함되어 있으므로 Numpy를 추가로 가져 오지 않고도 해당 함수를 모두 사용할 수 있습니다.

의도는 사용자가 네임 스페이스 scipynumpy네임 스페이스 의 차이점을 알 필요는 없지만 분명히 예외를 발견 한 것입니다.


50

SciPy FAQ 에서 NumPy의 일부 기능이 역사적인 이유로 여기에 있지만 SciPy에만 있어야하는 것으로 보입니다 .

NumPy와 SciPy의 차이점은 무엇입니까?

이상적인 세계에서 NumPy는 배열 데이터 유형과 색인, 정렬, 재구성, 기본 요소 별 함수 등과 같은 가장 기본적인 작업 만 포함합니다. 모든 숫자 코드는 SciPy에 있습니다. 그러나 NumPy의 중요한 목표 중 하나는 호환성입니다. 따라서 NumPy는 이전 버전 중 하나가 지원하는 모든 기능을 유지하려고합니다. 따라서 NumPy에는 선형 대수 함수가 포함되어 있지만 SciPy에 더 적합합니다. 어쨌든 SciPy에는 더 많은 기능을 갖춘 선형 대수 모듈 버전과 다른 많은 수치 알고리즘이 포함되어 있습니다. 파이썬으로 과학 컴퓨팅을 수행하는 경우 NumPy와 SciPy를 모두 설치해야합니다. 대부분의 새로운 기능은 NumPy가 아닌 SciPy에 속합니다.

이것은 왜 scipy.linalg.solve추가 기능을 제공 하는지 설명합니다 numpy.linalg.solve.

관련 질문에 대한 SethMMorton의 답변을 보지 못했습니다.


12

SciPy 문서 소개 끝에 짧은 설명이 있습니다.

또 다른 유용한 명령은 source입니다. 파이썬으로 작성된 함수가 인수로 주어지면 해당 함수의 소스 코드 목록을 인쇄합니다. 이것은 알고리즘에 대해 배우거나 함수가 인수로 수행하는 작업을 정확하게 이해하는 데 도움이 될 수 있습니다. 또한 모듈 또는 패키지의 네임 스페이스를 보는 데 사용할 수있는 Python 명령 디렉토리를 잊지 마십시오.

나는 이것이 모든 관련 패키지에 대한 충분한 지식을 가진 사람이 일부 scipy와 numpy 함수 의 차이점을 정확하게 골라 낼 수 있다고 생각 합니다 (log10 질문에 전혀 도움이되지 않았습니다). 나는 확실히 그 지식을 가지고 source있지 않지만 그것을 나타내며 다른 방식으로 lapack scipy.linalg.solvenumpy.linalg.solve상호 작용합니다.

Python 2.4.3 (#1, May  5 2011, 18:44:23) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
>>> import scipy
>>> import scipy.linalg
>>> import numpy
>>> scipy.source(scipy.linalg.solve)
In file: /usr/lib64/python2.4/site-packages/scipy/linalg/basic.py

def solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0,
          debug = 0):
    """ solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0) -> x

    Solve a linear system of equations a * x = b for x.

    Inputs:

      a -- An N x N matrix.
      b -- An N x nrhs matrix or N vector.
      sym_pos -- Assume a is symmetric and positive definite.
      lower -- Assume a is lower triangular, otherwise upper one.
               Only used if sym_pos is true.
      overwrite_y - Discard data in y, where y is a or b.

    Outputs:

      x -- The solution to the system a * x = b
    """
    a1, b1 = map(asarray_chkfinite,(a,b))
    if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]:
        raise ValueError, 'expected square matrix'
    if a1.shape[0] != b1.shape[0]:
        raise ValueError, 'incompatible dimensions'
    overwrite_a = overwrite_a or (a1 is not a and not hasattr(a,'__array__'))
    overwrite_b = overwrite_b or (b1 is not b and not hasattr(b,'__array__'))
    if debug:
        print 'solve:overwrite_a=',overwrite_a
        print 'solve:overwrite_b=',overwrite_b
    if sym_pos:
        posv, = get_lapack_funcs(('posv',),(a1,b1))
        c,x,info = posv(a1,b1,
                        lower = lower,
                        overwrite_a=overwrite_a,
                        overwrite_b=overwrite_b)
    else:
        gesv, = get_lapack_funcs(('gesv',),(a1,b1))
        lu,piv,x,info = gesv(a1,b1,
                             overwrite_a=overwrite_a,
                             overwrite_b=overwrite_b)

    if info==0:
        return x
    if info>0:
        raise LinAlgError, "singular matrix"
    raise ValueError,\
          'illegal value in %-th argument of internal gesv|posv'%(-info)

>>> scipy.source(numpy.linalg.solve)
In file: /usr/lib64/python2.4/site-packages/numpy/linalg/linalg.py

def solve(a, b):
    """
    Solve the equation ``a x = b`` for ``x``.

    Parameters
    ----------
    a : array_like, shape (M, M)
        Input equation coefficients.
    b : array_like, shape (M,)
        Equation target values.

    Returns
    -------
    x : array, shape (M,)

    Raises
    ------
    LinAlgError
        If `a` is singular or not square.

    Examples
    --------
    Solve the system of equations ``3 * x0 + x1 = 9`` and ``x0 + 2 * x1 = 8``:

    >>> a = np.array([[3,1], [1,2]])
    >>> b = np.array([9,8])
    >>> x = np.linalg.solve(a, b)
    >>> x
    array([ 2.,  3.])

    Check that the solution is correct:

    >>> (np.dot(a, x) == b).all()
    True

    """
    a, _ = _makearray(a)
    b, wrap = _makearray(b)
    one_eq = len(b.shape) == 1
    if one_eq:
        b = b[:, newaxis]
    _assertRank2(a, b)
    _assertSquareness(a)
    n_eq = a.shape[0]
    n_rhs = b.shape[1]
    if n_eq != b.shape[0]:
        raise LinAlgError, 'Incompatible dimensions'
    t, result_t = _commonType(a, b)
#    lapack_routine = _findLapackRoutine('gesv', t)
    if isComplexType(t):
        lapack_routine = lapack_lite.zgesv
    else:
        lapack_routine = lapack_lite.dgesv
    a, b = _fastCopyAndTranspose(t, a, b)
    pivots = zeros(n_eq, fortran_int)
    results = lapack_routine(n_eq, n_rhs, a, n_eq, pivots, b, n_eq, 0)
    if results['info'] > 0:
        raise LinAlgError, 'Singular matrix'
    if one_eq:
        return wrap(b.ravel().astype(result_t))
    else:
        return wrap(b.transpose().astype(result_t))

이것은 또한 첫 번째 게시물이므로 여기에서 무언가를 변경 해야하는 경우 알려주십시오.


기본 래퍼는 매우 다릅니다. NumPy는 C로 작성된 얇은 계층을 사용합니다. SciPy는 f2py에 의해 자동 생성 된 계층을 사용합니다. SciPy는 항상 외부 LAPACK 라이브러리와 연결됩니다. NumPy는 외부 LAPACK을 찾을 수없는 경우 자체 f2c'd lapack_lite를 사용합니다.
Sturla Molden

8

Wikipedia ( http://en.wikipedia.org/wiki/NumPy#History )에서 :

Numeric 코드는 Numarray의 새로운 기능을 구현할 수있을 정도로 유지 관리가 쉽고 유연하도록 조정되었습니다. 이 새로운 프로젝트는 SciPy의 일부였습니다. 배열 객체를 얻기 위해 전체 패키지를 설치하지 않으려면이 새로운 패키지를 분리하고 NumPy라고합니다.

scipy에 따라 numpy수입 많은 numpy편의를 위해 네임 스페이스로 기능합니다.


4

linalg 패키지와 관련하여-scipy 함수는 많은 플랫폼에서 고도로 최적화 된 버전으로 제공되며 특히 상당히 밀도가 높은 매트릭스에서 작업 할 때 매우 우수한 성능을 제공하는 lapack 및 blas를 호출합니다. 반면에, 그들은 컴파일하기 쉬운 라이브러리가 아니기 때문에 포트란 컴파일러와 완전한 성능을 얻기 위해 많은 플랫폼 특정 조정이 필요합니다. 따라서, numpy는 많은 목적을 위해 충분히 유용한 많은 일반적인 선형 대수 함수의 간단한 구현을 제공합니다.


numpy 1.10에는 멋진 모듈이 있습니다 dual. "사용 가능한 경우 numpy 버전을 사용하고 scipy 버전을 사용하려면 numpy 및 scipy 기능에이 모듈을 사용해야합니다." 사용 ---from numpy.dual import fft, inv
데니스

1

' 정량 경제학 ' 강의

SciPy는 배열 데이터 유형 및 관련 기능을 사용하여 NumPy 위에 구축 된 다양한 도구를 포함하는 패키지입니다

실제로 SciPy를 가져올 때 SciPy 초기화 파일에서 볼 수 있듯이 NumPy도 얻습니다.

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

__all__  = []
__all__ += _num.__all__
__all__ += ['randn', 'rand', 'fft', 'ifft']

del _num
# Remove the linalg imported from numpy so that the scipy.linalg package can be
# imported.
del linalg
__all__.remove('linalg')

그러나 NumPy 기능을 명시 적으로 사용하는 것이 더 일반적이고 더 나은 방법입니다.

import numpy as np

a = np.identity(3)

SciPy에서 유용한 것은 서브 패키지의 기능입니다

  • scipy.optimize, scipy.integrate, scipy.stats 등

1
NumPy 기능을 명시 적으로 사용하는 것이 더 나은 방법이라는 의견을 보았으며 SciPy 자습서를 포함하여 다른 곳에서 에코가 표시되는 이유는 무엇입니까? 아무도 대답하지 않는 것 같습니다. SciPy를 이미 가져오고 있는데 NumPy 기능이 포함되어 있다면 NumPy를 계속 가져 오는 것이 더 좋은 이유는 무엇입니까? SciPy에서 하위 패키지를 가져올 때 최상위 레벨을 가져 오지 않고 SciPy를 가져 오는 단계를 수행하는 대신 핵심 배열 처리 기능에 대해 Numpy를 가져와야합니까?
Dan Boschen

1

또한받는 SciPy FAQ 중복을 설명하면 주로 호환성을 위해, 그것은 상기에서 정화된다 NumPy와 서 있다고해도

선택적으로 SciPy 가속 루틴 (numpy.dual)

Scipy가 가속화 할 수있는 기능의 별명.

SciPy는 FFT, 선형 대수 및 특수 기능을 위해 가속되거나 개선 된 라이브러리를 사용하도록 구축 될 수 있습니다. 이 모듈을 사용하면 SciPy를 사용할 수있을 때 개발자가 이러한 가속 기능을 투명하게 지원할 수 있지만 NumPy 만 설치 한 사용자는 계속 지원할 수 있습니다.

간결하게하기 위해 다음과 같습니다.

  • 선형 대수
  • FFT
  • 첫 번째 종류의 수정 된 혈관 기능, 차수 0

또한 SciPy Tutorial에서 :

SciPy의 최상위 레벨에는 NumPy 및 numpy.lib.scimath의 함수도 포함되어 있습니다. 그러나 대신 NumPy 모듈에서 직접 사용하는 것이 좋습니다.

따라서 새로운 응용 프로그램의 경우 최상위 수준의 SciPy에 복제 된 NumPy 버전의 어레이 작업을 선호해야합니다. 위에 나열된 도메인의 경우 SciPy의 도메인을 선호하고 NumPy에서 필요한 경우 이전 버전과의 호환성을 확인해야합니다.

개인적인 경험에서, 내가 사용하는 대부분의 배열 함수는 최상위 레벨 NumPy에 있습니다 (제외 random). 그러나 모든 도메인 특정 루틴은 SciPy의 하위 패키지에 존재하므로 최상위 레벨의 SciPy에서는 거의 사용하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.