Отношения между SciPy и NumPy



SciPy, по-видимому, предоставляет большинство (но не все [1]) функций NumPy в своем собственном пространстве имен. Другими словами, если есть функция с именем numpy.foo, почти наверняка есть scipy.foo. В большинстве случаев они кажутся совершенно одинаковыми, часто даже указывая на один и тот же объект функции.



иногда, они разные. Чтобы привести пример, который появился недавно:





  • numpy.log10 это ufunc что возвращает NaNs для отрицательного аргументы;


  • scipy.log10 возвращает комплексные значения для отрицательных аргументов и не является ufunc.


то же самое можно сказать о log,log2 и logn, а не log1p [2].



С другой стороны, numpy.exp и scipy.exp похоже, что это разные имена для одного и того же ufunc. Это также относится и к scipy.log1p и numpy.log1p.



другой пример:numpy.linalg.solve vs scipy.linalg.solve. Они похожи, но последний предлагает некоторые дополнительные возможности по сравнению с прежним.



почему явное дублирование? Если это должно быть оптовым импортом numpy на scipy пространство имен, почему тонкие различия в поведении и недостающие функции? Есть ли какая-то всеобъемлющая логика, которая поможет прояснить путаницу?



[1] numpy.min,numpy.max,numpy.abs и некоторые другие не имеют аналогов в scipy пространство имен.



[2] протестировано с использованием NumPy 1.5.1 и SciPy 0.9.0rc2.

928   8  

8 ответов:

последний раз, когда я проверял его, scipy __init__ метод выполняет

from numpy import *

так что все пространство имен numpy включается в scipy при импорте модуля scipy.

The log10 поведение, которое вы описываете, интересно, потому что и версии поступают из numpy. Один-это ufunc, другой -

из справочного руководства SciPy:

... все функции библиотеки numpy есть был включен в scipy пространство имен так что все те функции доступны без кроме того, импорт Numpy.

намерение состоит в том, чтобы пользователи не должны были знать различие между scipy и numpy пространства имен, хотя, по-видимому, вы нашли исключение.

Кажется scipy FAQ что некоторые функции из NumPy находятся здесь по историческим причинам, в то время как он должен только в составляющей:

в чем разница между NumPy и SciPy?

в идеальном мире NumPy не будет содержать ничего, кроме типа данных массива и самые основные операции: индексирование, сортировка, переформирование, основные элементарные функции и так далее. Весь числовой код будет находиться в Составляющей. Однако, один из пакете numpy в важные цели-это совместимость, поэтому NumPy пытается сохранить все функции, поддерживаемые любым из его предшественников. Таким образом NumPy содержит некоторые функции линейной алгебры, хотя они больше правильно относятся в SciPy. В любом случае, SciPy содержит более полнофункциональный версии модулей линейной алгебры, а также многие другие численные алгоритмы. Если вы занимаетесь научными вычислениями с помощью python, вы должны вероятно, установить NumPy и SciPy. Большинство новых функций принадлежат составляющей а не NumPy.

Это объясняет, почему scipy.linalg.solve предлагает некоторые дополнительные функции над numpy.linalg.solve.

Я не видел ответа Сетммортона на вопрос

есть короткий комментарий в конце введение в SciPy документы:

еще одна полезная командаsource. При задании функции, написанной на Python в качестве аргумента, он выводит список исходного кода для этой функции. Это может быть полезно при изучении алгоритма или понимании того, что такое функция делаю со своими аргументами. Также не забывайте о команде Python dir, которая может быть раньше смотрел на пространство имен модуля или пакета.

Я думаю, что это позволит кому-то с достаточным знанием всех пакетов, участвующих, чтобы выбрать друг от друга именно то, что различия между некоторые функции scipy и numpy (это не помогло мне с вопросом log10 вообще). У меня определенно нет таких знаний, но source указывает, что scipy.linalg.solve и numpy.linalg.solve взаимодействовать с lapack по-разному;

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))

Это тоже мой первый пост, так что если я если что-то изменится здесь, Пожалуйста, дайте мне знать.

из Википедии (http://en.wikipedia.org/wiki/NumPy#History ):

цифровой код был адаптирован, чтобы сделать он более ремонтопригодный и гибкий достаточно реализовать новые возможности из Numarray. Этот новый проект был частью из составляющей. Чтобы избежать установки целого пакет просто для получения объекта массива, этот новый пакет был отделен и позвонил и NumPy.

scipy зависит от numpy и импорта много numpy функции в свое пространство имен для удобства.

Что касается пакета linalg - функции scipy будут вызывать lapack и blas, которые доступны в сильно оптимизированных версиях на многих платформах и предлагают очень хорошую производительность, особенно для операций с достаточно большими плотными матрицами. С другой стороны, они не являются легкими библиотеками для компиляции, требуя компилятора fortran и многих специфичных для платформы настроек для получения полной производительности. Поэтому numpy предоставляет простые реализации многих общих функций линейной алгебры, которые являются часто достаточно хорошо для многих целей.

из лекций по 'Количественная Экономика'

SciPy-это пакет, который содержит различные инструменты, построенные поверх NumPy, используя его тип данных массива и связанные с ним функции

на самом деле, когда мы импортируем SciPy, мы также получаем NumPy, как видно из файла инициализации SciPy

# 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.оптимизировать, составляющей.интеграции, составляющей.статистика и др.

кроме SciPy FAQ описание дублирования в основном для обратной совместимости, это дополнительно уточняется в документация включает в себя говорил, что

дополнительно составляющей ускорения процедур (включает в себя.двойной)

псевдонимы для функций, которые могут быть ускорены Scipy.

SciPy может быть построен для использования ускоренных или иным образом улучшенных библиотек для БПФ, линейной алгебры и специальная функция. Этот модуль позволяет разработчики прозрачно поддерживают эти ускоренные функции, когда SciPy доступен, но все еще поддерживает пользователей, которые только установили И NumPy.

для краткости, это:

  • линейная алгебра
  • ФФТ
  • модифицированная функция Бесселя первого рода, порядка, 0

С SciPy Tutorial:

верхний уровень Составляющей также содержит функции NumPy и и NumPy.движение за освобождение.скимат. Тем не менее, лучше использовать их непосредственно из Вместо этого модуль NumPy.

таким образом, для новых приложений вы должны предпочесть версию numpy операций с массивами, которые дублируются на верхнем уровне SciPy. Для доменов, перечисленных выше, вы должны предпочесть те, что в SciPy и проверить обратную совместимость, если это необходимо в NumPy.

по моему личному опыту, большинство функций массива я использую существуют в верхнем уровне NumPy (за исключением random). Однако все доменные подпрограммы существуют в подпакетах SciPy, поэтому я редко использую что-либо из верхнего уровня SciPy.

Comments

    Ничего не найдено.