Примечания к релизу NumPy 1.10.0#

Эта версия поддерживает Python 2.6 - 2.7 и 3.2 - 3.5.

Основные моменты#

  • numpy.distutils теперь поддерживает параллельную компиляцию через аргумент –parallel/-j, передаваемый в setup.py build

  • numpy.distutils теперь поддерживает дополнительную настройку через site.cfg для управления параметрами компиляции, т.е. библиотеками времени выполнения, дополнительными флагами компоновки/компиляции.

  • Добавление np.linalg.multi_dot: вычисляет скалярное произведение двух или более массивов в одном вызове функции, автоматически выбирая самый быстрый порядок вычислений.

  • Новая функция np.stack предоставляет общий интерфейс для объединения последовательности массивов вдоль новой оси, дополняя np.concatenate для объединения вдоль существующей оси.

  • Добавление nanprod к набору nanfunctions.

  • Поддержка оператора '@' в Python 3.5.

Удалена поддержка#

  • Модуль _dotblas был удален. Поддержка CBLAS теперь находится в Multiarray.

  • Файл testcalcs.py был удален.

  • Файл polytemplate.py был удалён.

  • npy_PyFile_Dup и npy_PyFile_DupClose были удалены из npy_3kcompat.h.

  • splitcmdline удалена из numpy/distutils/exec_command.py.

  • try_run и get_output были удалены из numpy/distutils/command/config.py

  • Атрибут a._format больше не поддерживается для вывода массивов.

  • Ключевые слова skiprows и missing удалён из np.genfromtxt.

  • Ключевое слово old_behavior удалено из np.correlate.

Будущие изменения#

  • В сравнениях массивов, таких как arr1 == arr2, многие крайние случаи, связанные со строками или структурированными dtypes, которые раньше возвращали скаляры, теперь выдают FutureWarning или DeprecationWarning, и в будущем будет изменён для выполнения поэлементных сравнений или вызова ошибки.

  • В np.lib.split пустой массив в результате всегда имел размерность (0,) независимо от размерностей разделяемого массива. В Numpy 1.11 это поведение будет изменено, чтобы размерности сохранялись. FutureWarning для этого изменения действует с Numpy 1.9, но, из-за ошибки, иногда предупреждение не выдавалось, и размерности уже сохранялись.

  • Класс SafeEval будет удален в Numpy 1.11.

  • Функции alterdot и restoredot будут удалены в NumPy 1.11.

Смотрите ниже для более подробной информации об этих изменениях.

Примечания по совместимости#

Изменение правила приведения по умолчанию#

Приведение по умолчанию для операций на месте изменилось на 'same_kind'. Например, если n - массив целых чисел, а f - массив чисел с плавающей точкой, то n += f приведёт к TypeError, тогда как в предыдущих версиях Numpy числа с плавающей запятой молча приводились к целым числам. В маловероятном случае, что пример кода не является фактической ошибкой, его можно обновить обратно совместимым способом, переписав как np.add(n, f, out=n, casting='unsafe'). Старый 'unsafe' значение по умолчанию устарело с NumPy 1.7.

строка версии numpy#

Строка версии numpy для сборок разработки была изменена с x.y.z.dev-githash to x.y.z.dev0+githash (обратите внимание на +) для соответствия PEP 440.

relaxed stride checking#

NPY_RELAXED_STRIDE_CHECKING теперь по умолчанию имеет значение true.

ОБНОВЛЕНИЕ: В версии 1.10.2 значение по умолчанию NPY_RELAXED_STRIDE_CHECKING было изменено на false для обратной совместимости. Требуется больше времени, прежде чем его можно будет сделать значением по умолчанию. В рамках дорожной карты также было добавлено устаревание представлений, изменяющих размерность для массивов, f_contiguous, но не c_contiguous.

Конкатенация 1D массивов вдоль любой оси, кроме axis=0 вызывает IndexError#

Использование axis != 0 вызывало DeprecationWarning с NumPy 1.7, теперь вызывает ошибку.

np.ravel, np.diagonal и np.diag теперь сохраняют подтипы#

Наблюдалось несоответствие в поведении между x.ravel() и np.ravel(x), а также между x.diagonal() и np.diagonal(x), с методами, сохраняющими подтипы, в то время как функции этого не делали. Это исправлено, и функции теперь ведут себя как методы, сохраняя подтипы, за исключением случая матриц. Матрицы обрабатываются особым образом для обратной совместимости и по-прежнему возвращают 1-D массивы, как раньше. Если вам нужно сохранить подтип матрицы, используйте методы вместо функций.

rollaxis и swapaxes всегда возвращает представление#

Ранее возвращалось представление, за исключением случаев, когда порядок осей не менялся, тогда возвращался входной массив. Теперь представление возвращается во всех случаях.

nonzero теперь возвращает базовые ndarrays#

Ранее существовало несоответствие между одномерными входными данными (возвращающими базовый ndarray) и многомерными (которые сохраняли подклассы). Поведение было унифицировано, и возвращаемое значение теперь будет базовым ndarray. Подклассы всё ещё могут переопределить это поведение, предоставив свой собственный nonzero метод.

C API#

Изменения в swapaxes также применяются к PyArray_SwapAxes C-функция, которая теперь возвращает представление во всех случаях.

Изменения в nonzero также применяются к PyArray_Nonzero функции C, которая теперь возвращает базовый ndarray во всех случаях.

Структура dtype (PyArray_Descr) имеет новый член в конце для кэширования его хэш-значения. Это не должно влиять на хорошо написанные приложения.

Изменение функции конкатенации DeprecationWarning также затрагивает PyArray_ConcatenateArrays,

типы возвращаемых значений полей recarray#

Ранее возвращаемые типы для полей recarray, доступных по атрибуту и по индексу, были несогласованными, а поля строкового типа возвращались как chararrays. Теперь поля, доступные как по атрибуту, так и по индексу, будут возвращать ndarray для полей неструктурированного типа и recarray для полей структурированного типа. В частности, это влияет на recarrays, содержащие строки с пробелами, так как конечные пробелы обрезаются в chararrays, но сохраняются в ndarrays строкового типа. Кроме того, dtype.type вложенных структурированных полей теперь наследуется.

представления recarray#

Рассмотрение ndarray как recarray теперь автоматически преобразует dtype в np.record. См. новую документацию по массивам записей. Кроме того, просмотр recarray с неструктурированным dtype больше не преобразует тип результата в ndarray — результат останется recarray.

аргумент ключевого слова 'out' у ufuncs теперь принимает кортежи массивов#

При использовании ключевого аргумента 'out' уфункции можно предоставить кортеж массивов, по одному на каждый выход уфункции. Для уфункций с одним выходом одиночный массив также является допустимым ключевым аргументом 'out'. Ранее одиночный массив можно было предоставить в ключевом аргументе 'out', и он использовался как первый выход для уфункций с несколькими выходами, что устарело и приведет к DeprecationWarning сейчас и ошибка в будущем.

индексы в виде байтовых массивов теперь вызывают IndexError#

Индексирование ndarray с использованием байтовой строки в Python 3 теперь вызывает IndexError вместо ValueError.

Маскированные массивы, содержащие объекты с массивами#

Для таких (редких) маскированных массивов получение одного маскированного элемента больше не возвращает поврежденный маскированный массив, а полностью маскированную версию элемента.

Median предупреждает и возвращает nan при обнаружении недопустимых значений#

Аналогично mean, median и percentile теперь выдают предупреждение Runtime и возвращают NaN в срезах, где NaN присутствует. Для вычисления медианы или процентиля с игнорированием недопустимых значений используйте новый nanmedian или nanpercentile функций.

Функции, доступные из numpy.ma.testutils, изменились#

Все функции из numpy.testing когда-то были доступны из numpy.ma.testutils, но не все из них были переопределены для работы с маскированными массивами. Большинство этих функций теперь удалены из numpy.ma.testutils, с небольшим подмножеством, оставленным для сохранения обратной совместимости. В долгосрочной перспективе это должно помочь избежать ошибочного использования неправильных функций, но может вызвать проблемы с импортом для некоторых.

Новые возможности#

Чтение дополнительных флагов из site.cfg#

Ранее настройка компиляции зависимых библиотек и самого numpy была возможна только через изменения кода в пакете distutils. Теперь numpy.distutils читает следующие дополнительные флаги из каждой группы site.cfg:

  • runtime_library_dirs/rpath, устанавливает каталоги библиотек времени выполнения для переопределения

    LD_LIBRARY_PATH

  • extra_compile_args, добавьте дополнительные флаги к компиляции исходников

  • extra_link_args, добавить дополнительные флаги при связывании библиотек

Это должно, по крайней мере частично, завершить пользовательскую настройку.

np.cbrt для вычисления кубического корня для вещественных чисел с плавающей точкой#

np.cbrt оборачивает функцию кубического корня C99 cbrt. По сравнению с np.power(x, 1./3.) Он хорошо определен для отрицательных вещественных чисел с плавающей точкой и немного быстрее.

numpy.distutils теперь позволяет параллельную компиляцию#

Передавая –parallel=n или -j n to setup.py build компиляция расширений теперь выполняется в n параллельных процессов. Параллелизация ограничена файлами в одном расширении, поэтому проекты, использующие Cython, не выиграют, так как он строит расширения из отдельных файлов.

genfromtxt имеет новый max_rows аргумент#

A max_rows аргумент был добавлен в genfromtxt для ограничения количества строк, считываемых за один вызов. Используя эту функциональность, можно считывать несколько массивов, хранящихся в одном файле, с помощью повторных вызовов функции.

Новая функция np.broadcast_to для вызова широковещания массивов#

np.broadcast_to вручную транслирует массив в заданную форму согласно правилам трансляции numpy. Функциональность аналогична broadcast_arrays, который, по сути, был переписан для использования broadcast_to внутри, но требуется только один массив.

Новый контекстный менеджер clear_and_catch_warnings для тестирования предупреждений#

Когда Python выдает предупреждение, он записывает, что это предупреждение было выдано в модуле, вызвавшем предупреждение, в атрибуте модуля __warningregistry__. Как только это произошло, невозможно выдать предупреждение снова, если вы не очистите соответствующую запись в __warningregistry__. Это затрудняет и делает хрупким тестирование предупреждений, потому что если ваш тест выполняется после другого, который уже вызвал предупреждение, вы не сможете сгенерировать предупреждение или протестировать его. Контекстный менеджер clear_and_catch_warnings очищает предупреждения из реестра модулей при входе и сбрасывает их при выходе, что позволяет повторно вызывать предупреждения.

cov имеет новые fweights и aweights аргументы#

The fweights и aweights аргументы добавляют новую функциональность к расчётам ковариации, применяя два типа взвешивания к векторам наблюдений. Массив fweights указывает количество повторений каждого вектора наблюдений, и массив aweights предоставляет их относительную важность или вероятность.

Поддержка оператора '@' в Python 3.5+#

Python 3.5 добавляет поддержку оператора матричного умножения '@', предложенного в PEP465. Предварительная поддержка этого оператора была реализована, и эквивалентная функция matmul также был добавлен для целей тестирования и использования в более ранних версиях Python. Функция является предварительной, и порядок и количество её необязательных аргументов могут измениться.

Новый аргумент norm для функций fft#

Стандартная нормализация имеет прямые преобразования без масштабирования, а обратные преобразования масштабируются на \(1/n\)Возможно получить унитарные преобразования, установив аргумент ключевого слова norm to "ortho" (по умолчанию None) так, что и прямое, и обратное преобразования будут масштабированы на \(1/\\sqrt{n}\).

Улучшения#

np.poly теперь преобразует целочисленные входные данные в float#

np.poly теперь будет преобразовывать одномерные входные массивы целочисленного типа в числа с плавающей точкой двойной точности, чтобы предотвратить переполнение целых чисел при вычислении мономиального полинома. По-прежнему можно получить результаты с более высокой точностью, передав массив типа object, заполненный, например, целыми числами Python.

np.interp теперь может использоваться с периодическими функциями#

np.interp теперь имеет новый параметр период который предоставляет период входных данных xp. В таком случае входные данные правильно нормализуются к заданному периоду, и к каждому концу добавляется одна конечная точка xp чтобы закрыть предыдущий и следующий циклы периодов, обеспечивая корректное поведение интерполяции.

np.pad поддерживает больше типов входных данных для pad_width и constant_values#

constant_values параметры теперь принимают массивы NumPy и значения с плавающей точкой. Массивы NumPy поддерживаются как входные данные для pad_width, и возникает исключение, если его значения не являются целочисленными.

np.argmax и np.argmin теперь поддерживают out аргумент#

The out параметр был добавлен в np.argmax и np.argmin для согласованности с ndarray.argmax и ndarray.argmin. Новый параметр ведёт себя точно так же, как и в этих методах.

Обнаружены и используются дополнительные системные функции C99 для комплексных чисел#

Все функции in complex.h теперь обнаруживаются. Существуют новые резервные реализации следующих функций.

  • npy_ctan,

  • npy_cacos, npy_casin, npy_catan

  • npy_ccosh, npy_csinh, npy_ctanh,

  • npy_cacosh, npy_casinh, npy_catanh

В результате этих улучшений будут небольшие изменения в возвращаемых значениях, особенно для крайних случаев.

np.loadtxt поддержка строк, созданных float.hex метод#

Строки, созданные float.hex выглядит как 0x1.921fb54442d18p+1, так что это не шестнадцатеричное представление беззнаковых целочисленных типов.

np.isclose правильно обрабатывает минимальные значения целочисленных типов данных#

Для правильной обработки минимальных значений целочисленных типов, np.isclose теперь будет преобразовывать в тип float во время сравнений. Это согласует его поведение с тем, что предоставлялось np.allclose.

np.allclose использует np.isclose внутренне.#

np.allclose теперь использует np.isclose внутренне и наследует возможность сравнивать NaN как равные, устанавливая equal_nan=True. Подклассы, такие как np.ma.MaskedArray, также теперь сохраняются.

np.genfromtxt теперь корректно обрабатывает большие целые числа#

np.genfromtxt теперь корректно обрабатывает целые числа больше 2**31-1 на 32-битных системах и больше, чем 2**63-1 на 64-битных системах (ранее он падал с OverflowError в этих случаях). Целые числа больше 2**63-1 преобразуются в значения с плавающей запятой.

np.load, np.save иметь флаги обратной совместимости pickle#

Функции np.load и np.save имеют дополнительные ключевые аргументы для управления обратной совместимостью сериализованных Python объектов. Это позволяет Numpy на Python 3 загружать npy-файлы, содержащие массивы объектов, сгенерированные на Python 2.

Поддержка MaskedArray для более сложных базовых классов#

Встроенные предположения, что базовый класс ведёт себя как простой массив, удаляются. В частности, установка и получение элементов и диапазонов будут учитывать переопределения базового класса __setitem__ и __getitem__, и арифметика будет учитывать переопределения __add__, __sub__, и т.д.

Изменения#

функциональность dotblas перемещена в multiarray#

Версии cblas для dot, inner и vdot были интегрированы в модуль multiarray. В частности, vdot теперь является функцией multiarray, чего не было раньше.

более строгая проверка соответствия сигнатуры gufunc#

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

представления, возвращенные из np.einsum доступны для записи#

Представления, возвращаемые np.einsum теперь будет доступен для записи, когда входной массив доступен для записи.

np.argmin пропускает значения NaT#

np.argmin теперь пропускает значения NaT в массивах datetime64 и timedelta64, делая это согласованным с np.min, np.argmax и np.max.

Устаревшие функции#

Сравнения массивов, включающие строки или структурированные типы данных#

Обычно операции сравнения над массивами выполняют поэлементные сравнения и возвращают массивы булевых значений. Но в некоторых крайних случаях, особенно с участием строк и структурированных типов данных, NumPy исторически возвращал скаляр. Например:

### Current behaviour

np.arange(2) == "foo"
# -> False

np.arange(2) < "foo"
# -> True on Python 2, error on Python 3

np.ones(2, dtype="i4,i4") == np.ones(2, dtype="i4,i4,i4")
# -> False

Продолжая работу, начатую в версии 1.9, в версии 1.10 эти сравнения теперь будут вызывать FutureWarning или DeprecationWarning, и в будущем они будут изменены, чтобы вести себя более согласованно с другими операциями сравнения, например:

### Future behaviour

np.arange(2) == "foo"
# -> array([False, False])

np.arange(2) < "foo"
# -> error, strings and numbers are not orderable

np.ones(2, dtype="i4,i4") == np.ones(2, dtype="i4,i4,i4")
# -> [False, False]

SafeEval#

Класс SafeEval в numpy/lib/utils.py устарел и будет удален в следующем выпуске.

alterdot, restoredot#

Функции alterdot и restoredot больше ничего не делают и устарели.

в массив ndarray, каждый из которых имеет одинаковый тип данных. Тип выбирается тем же способом, что и#

Эти способы загрузки пакетов теперь устарели.

аргументы bias, ddof для corrcoef#

Значения для bias и ddof аргументы для corrcoef функция была отменена в делении, подразумеваемом коэффициентом корреляции, и поэтому не влияла на возвращаемые значения.

Теперь мы объявляем эти аргументы устаревшими для corrcoef и версия с маскированным массивом ma.corrcoef.

Поскольку мы устареваем bias аргумент для ma.corrcoef, мы также устареваем использование allow_masked аргумент как позиционный аргумент, так как его позиция изменится с удалением bias. allow_masked в будущем станет аргументом только по ключевому слову.

изменения строкового представления dtype#

Начиная с версии 1.6, создание объекта dtype из его строкового представления, например 'f4', выдавал бы предупреждение об устаревании, если размер не соответствовал существующему типу, и по умолчанию создавал dtype размера по умолчанию для типа. Начиная с этого релиза, теперь будет вызываться TypeError.

Единственное исключение — это dtypes object, где оба 'O4' и 'O8' всё равно будет выдано предупреждение об устаревании. Это зависящее от платформы представление вызовет ошибку в следующем выпуске.

В преддверии этого предстоящего изменения строковое представление dtype объекта, т.е. np.dtype(object).str, больше не включает размер элемента, т.е. будет возвращать '|O' вместо '|O4' или '|O8' как раньше.