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 vs scipy.linalg.solve. Они похожи, но последний предлагает некоторые дополнительные функции над первым.
Почему очевидное дублирование? Если это предназначено для оптового импорта numpy в пространство имен scipy, почему тонкие различия в поведении и недостающие функции? Есть ли какая-то всеобъемлющая логика, которая поможет устранить путаницу?
[1] numpy.min, numpy.max, numpy.abs, а некоторые другие не имеют аналогов в пространстве имен scipy.
[2] Протестировано с использованием numpy 1.5.1 и scipy 0.9.0rc2.