Примечания к релизу 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.digitize используя бинарный поиск#
np.digitize теперь реализован через np.searchsorted. Это означает, что для группировки значений используется двоичный поиск, который масштабируется гораздо лучше для большего количества групп, чем предыдущий линейный поиск. Это также устраняет требование, чтобы входной массив был одномерным.
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' как
раньше.