Почему NumPy и SciPy имеют много одинаковых функций? Что я должен предпочесть?

Возможный дубликат:
Связь между scipy и numpy

Например, NumPy имеет функции окна bartlett, blackman, hamming, hanning, kaiser, в то время как SciPy имеет эти и еще несколько, но они, похоже, производят идентичный вывод.

NumPy имеет numpy.fft.fft2(a, s=None, axes=(-2, -1)).

SciPy имеет scipy.fftpack.fft2(x, shape=None, axes=(-2, -1), overwrite_x=0).

Почему существуют дубликаты? Только для обратной совместимости? Если да, то почему они различаются по разному? Что я должен предпочесть при написании чего-то нового?

Ответ 1

Из Часто задаваемые вопросы по SciPy:

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

Итак, дубликаты предназначены для обратной совместимости. В общем, они дают тот же результат. Однако, как указано в FAQ, новые функции обычно внедряются в SciPy, но не обязательно NumPy. Это включает исправления ошибок. Я нашел, например, что numpy.linalg.eig вернул неправильные собственные значения для сложной матрицы, тогда как scipy.linalg.eig вернул правильные.

В общем, я предпочитаю придерживаться сценария "идеального мира" из FAQ: я использую NumPy для основных манипуляций с массивами и SciPy для всей моей линейной алгебры. Таким образом, я не сталкиваюсь с неожиданностями.