SciPy предоставляет большинство (но не все [1]) функций NumPy в своем собственном пространстве имен. Другими словами, если есть названная функция numpy.foo
, почти наверняка есть scipy.foo
. В большинстве случаев они выглядят совершенно одинаково, часто даже указывают на один и тот же функциональный объект.
Иногда они разные. Чтобы привести пример, который недавно появился:
numpy.log10
является ufunc, который возвращает NaN для отрицательных аргументов;scipy.log10
возвращает комплексные значения для отрицательных аргументов и, по-видимому, не является функцией ufunc.
То же самое можно сказать и о log
, log2
и logn
, но не об log1p
[2].
С другой стороны, numpy.exp
и, scipy.exp
кажется, разные имена для одного и того же ufunc. Это также верно scipy.log1p
и для numpy.log1p
.
Другим примером может служить numpy.linalg.solve
против scipy.linalg.solve
. Они похожи, но последний предлагает некоторые дополнительные функции по сравнению с первым.
Почему явное дублирование? Если это предназначено для оптового импорта numpy
в scipy
пространство имен, почему тонкие различия в поведении и отсутствующих функциях? Есть ли какая-то всеобъемлющая логика, которая поможет устранить путаницу?
[1] numpy.min
, numpy.max
, numpy.abs
и некоторые другие не имеют аналогов в scipy
пространстве имен.
[2] Протестировано с использованием NumPy 1.5.1 и SciPy 0.9.0rc2.
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). Так они провалились?Ответы:
В последний раз, когда я проверял это,
__init__
метод scipy выполняеттак что все пространство имен numpy будет включено в scipy при импорте модуля scipy.
log10
Поведение вы описываете интересно, потому что обе версии идут от NumPy. Один - этоufunc
, другой - этоnumpy.lib
функция. Почему Сципи предпочитает библиотечную функциюufunc
, я не знаю, насколько это возможно.РЕДАКТИРОВАТЬ: На самом деле я могу ответить на
log10
вопрос. Глядя в__init__
метод scipy, я вижу это:log10
Функция , которую вы получите в SciPy происходит отnumpy.lib.scimath
. Глядя на этот код, он говорит:Кажется , что модуль накладки базы Numpy ufuncs для
sqrt
,log
,log2
,logn
,log10
,power
,arccos
,arcsin
, иarctanh
. Это объясняет поведение, которое вы видите. Основная причина дизайна, почему это делается так, вероятно, где-то скрыта в посте списка рассылки.источник
Из Справочного руководства SciPy:
Намерение пользователям не нужно знать различие между
scipy
иnumpy
пространствами имен, хотя , по- видимому вы нашли исключение.источник
Из FAQ по SciPy видно, что некоторые функции из NumPy есть здесь по историческим причинам, хотя это должно быть только в SciPy:
Это объясняет, почему
scipy.linalg.solve
предлагает некоторые дополнительные функцииnumpy.linalg.solve
.Я не видел ответа SethMMorton на связанный вопрос
источник
В конце введения в документацию SciPy есть небольшой комментарий :
Я думаю, что это позволит человеку, обладающему достаточными знаниями обо всех задействованных пакетах, точно разобрать, в чем разница между некоторыми функциями scipy и numpy (это совсем не помогло мне с вопросом log10). Я определенно не обладаю этим знанием, но
source
действительно указываю на этоscipy.linalg.solve
иnumpy.linalg.solve
взаимодействую с Лапаком по-разному;Это также мой первый пост, поэтому, если я должен что-то изменить здесь, пожалуйста, дайте мне знать.
источник
Из Википедии ( http://en.wikipedia.org/wiki/NumPy#History ):
scipy
зависит отnumpy
и импортирует многиеnumpy
функции в свое пространство имен для удобства.источник
Что касается пакета linalg - функции scipy будут вызывать lapack и blas, которые доступны в высокооптимизированных версиях на многих платформах и предлагают очень хорошую производительность, особенно для операций с достаточно большими плотными матрицами. С другой стороны, это непростые библиотеки для компиляции, требующие компилятора fortran и множества настроек для конкретной платформы, чтобы получить полную производительность. Следовательно, numpy предоставляет простые реализации многих общих функций линейной алгебры, которые часто достаточно хороши для многих целей.
источник
dual
: «Этот модуль следует использовать для функций как в numpy, так и в scipy, если вы хотите использовать версию numpy, если она доступна, но версию scipy в противном случае». Использование ---from numpy.dual import fft, inv
Из лекций на тему « Количественная экономика »
SciPy - это пакет, который содержит различные инструменты, созданные на основе NumPy, с использованием его типа данных массива и соответствующей функциональности.
Фактически, когда мы импортируем SciPy, мы также получаем NumPy, как видно из файла инициализации SciPy.
Тем не менее, более распространенным явлением является использование явных функций NumPy.
Что полезно в SciPy, так это функциональность его подпакетов.
источник
В дополнение к часто задаваемым вопросам SciPy, описывающим дублирование, в основном для обратной совместимости, в документации NumPy дополнительно разъясняется , что
Для краткости это:
Также из учебника SciPy :
Таким образом, для новых приложений вы должны предпочесть версию операций с массивами, которые дублируются на верхнем уровне SciPy. Для доменов, перечисленных выше, вы должны предпочесть те из них, которые есть в SciPy, и при необходимости проверить обратную совместимость в NumPy.
По моему личному опыту, большинство функций массива, которые я использую, существуют на верхнем уровне NumPy (за исключением
random
). Тем не менее, все специфичные для домена подпрограммы существуют в подпакетах SciPy, поэтому я редко использую что-либо из верхнего уровня SciPy.источник