Примечания к выпуску NumPy 1.7.0#
Этот выпуск включает несколько новых функций, а также многочисленные исправления ошибок и рефакторинги. Он поддерживает Python 2.4 - 2.7 и 3.1 - 3.3 и является последним выпуском, поддерживающим Python 2.4 - 2.5.
Основные моменты#
where=параметр для ufuncs (позволяет использовать булевы массивы для выбора где должно выполняться вычисление)vectorizeулучшения (добавлены ключевые слова 'excluded' и 'cache', общая очистка и исправления ошибок)numpy.random.choice(функция генерации случайной выборки)
Примечания по совместимости#
В будущей версии numpy функции np.diag, np.diagonal и метод diagonal объектов ndarray будут возвращать представление исходного массива, вместо создания копии, как сейчас. Это имеет значение, если вы записываете в массив, возвращаемый любой из этих функций. Для облегчения этого перехода numpy 1.7 выдает FutureWarning, если обнаруживает, что вы можете пытаться записать в такой массив. Подробности см. в документации np.diagonal.
Аналогично np.diagonal выше, в будущей версии numpy индексация массива записей по списку имен полей будет возвращать представление исходного массива, вместо создания копии, как это происходит сейчас. Как и с np.diagonal, numpy 1.7 выдает FutureWarning, если обнаруживает, что вы можете пытаться записать в такой массив. Подробности см. в документации по индексации массивов.
В будущей версии numpy правило приведения по умолчанию для параметров out= UFunc будет изменено с 'unsafe' на 'same_kind'. (Это также применяется к операциям на месте, таким как a += b, что эквивалентно np.add(a, b, out=a).) Большинство случаев использования, нарушающих правило 'same_kind', вероятно, являются ошибками, поэтому это изменение может выявить ранее необнаруженные ошибки в проектах, зависящих от NumPy. В этой версии numpy такие случаи использования будут продолжать работать, но будут вызывать предупреждение DeprecationWarning.
Полно-массивная булева индексация была оптимизирована для использования другого, оптимизированного пути выполнения. Этот путь должен давать те же результаты, но любая обратная связь об изменениях в вашем коде будет оценена.
Попытка записи в массив только для чтения (с arr.flags.writeable
установлено в False) ранее вызывал либо RuntimeError, ValueError, либо TypeError непоследовательно, в зависимости от того, какой путь кода был выбран. Теперь он последовательно вызывает ValueError.
Функции
Если обновляетесь с версии 1.5, то в целом в версиях 1.6 и 1.7 было добавлено значительное количество кода и изменены некоторые пути выполнения, особенно в областях разрешения типов и буферизованной итерации по универсальным функциям. Это может повлиять на ваш код, особенно если вы полагались на случайное поведение в прошлом.
Новые возможности#
Универсальные функции редукции обобщают параметр axis=#
Любой вызов функции ufunc.reduce, а также другие редукции, такие как sum, prod, any, all, max и min, поддерживают возможность выбора подмножества осей для редукции. Ранее можно было указать axis=None, чтобы обозначить все оси, или axis=#, чтобы выбрать одну ось. Теперь также можно указать axis=(#,#), чтобы выбрать список осей для редукции.
Редукционные UFuncs Новый параметр keepdims=#
Есть новый параметр keepdims=, который, если установлен в True, не отбрасывает оси редукции, а устанавливает их размером один. Когда эта опция включена, результат редукции будет корректно транслироваться на исходный операнд, который был редуцирован.
Поддержка даты и времени#
Примечание
API даты и времени экспериментальный в версии 1.7.0 и может претерпеть изменения в будущих версиях NumPy.
Было много исправлений и улучшений для datetime64 по сравнению с NumPy 1.6:
парсер довольно строг в отношении принятия только дат в формате ISO 8601, с несколькими удобными расширениями
корректно преобразует между единицами измерения
арифметика даты и времени работает корректно
функциональность рабочих дней (позволяет использовать datetime в контекстах, где действительны только определенные дни недели)
Примечания в doc/source/reference/arrays.datetime.rst (также доступно в онлайн-документации на arrays.datetime.html) следует обратиться для получения дополнительных деталей.
Пользовательский форматтер для печати массивов#
Смотрите новый formatter параметр numpy.set_printoptions
функция.
Новая функция numpy.random.choice#
Добавлена общая функция выборки, которая будет генерировать выборки из заданного массиво-подобного объекта. Выборки могут быть с возвращением или без, и с равномерными или заданными неравномерными вероятностями.
Новая функция isclose#
Возвращает логический массив, где два массива поэлементно равны в пределах допуска. Можно указать как относительный, так и абсолютный допуск.
Предварительная поддержка многомерных данных в пакете polynomial#
Ключевые слова axis были добавлены к функциям интегрирования и дифференцирования, а ключевое слово tensor было добавлено к функциям вычисления. Эти дополнения позволяют использовать многомерные массивы коэффициентов в этих функциях. Были добавлены новые функции для вычисления 2-D и 3-D массивов коэффициентов на сетках или наборах точек вместе с 2-D и 3-D псевдо-матрицами Вандермонда, которые можно использовать для аппроксимации.
Возможность дополнять массивы ранга n#
Добавлен модуль pad, содержащий функции для заполнения n-мерных массивов. Различные приватные функции заполнения представлены как опции для общедоступной функции 'pad'. Пример:
pad(a, 5, mode='mean')
Текущие режимы: constant, edge, linear_ramp, maximum,
mean, median, minimum, reflect, symmetric, wrap, и
.
Новый аргумент для searchsorted#
Функция searchsorted теперь принимает аргумент 'sorter', который является массивом перестановок, сортирующим массив для поиска.
Система сборки#
Добавлена экспериментальная поддержка архитектуры AArch64.
C API#
Новая функция PyArray_FailUnlessWriteable предоставляет согласованный интерфейс
для проверки возможности записи массива – любой код на C, который работает с массивами, чей
флаг WRITEABLE не известен как True априори, должен убедиться, что вызывает
эту функцию перед записью.
Добавлено руководство по стилю NumPy C (doc/C_STYLE_GUIDE.rst).
Изменения#
Общее#
Функция np.concatenate пытается соответствовать расположению входных массивов. Ранее расположение не следовало какой-либо конкретной логике и зависело нежелательным образом от выбранной оси для конкатенации. Также была исправлена ошибка, которая молча позволяла использовать аргументы оси вне границ.
Универсальные функции logical_or, logical_and и logical_not теперь следуют поведению Python с объектными массивами, вместо попытки вызова методов на объектах. Например, выражение (3 and 'test') даёт строку 'test', и теперь np.logical_and(np.array(3, 'O'), np.array('test', 'O')) также даёт 'test'.
The .base атрибут на ndarrays, который используется в представлениях для гарантии, что
базовый массив, владеющий памятью, не освобождается преждевременно, теперь
устраняет ссылки, когда у вас есть представление-от-представления. Например:
a = np.arange(10)
b = a[1:]
c = b[1:]
В numpy 1.6, c.base является b, и c.base.base является a. В numpy 1.7,
c.base является a.
Для повышения обратной совместимости программного обеспечения, которое полагается на старое поведение .base, мы 'пропускаем' только объекты, имеющие точно такой же тип, как вновь созданное представление. Это имеет значение, если вы используете ndarray
подклассы. Например, если у нас есть смесь ndarray и matrix объекты,
которые являются представлениями одного и того же исходного ndarray:
a = np.arange(10)
b = np.asmatrix(a)
c = b[0, 1:]
d = c[0, 1:]
затем d.base будет b. Это связано с тем, что d является matrix object, и поэтому процесс свёртки продолжается только до тех пор, пока встречаются другие
matrix объектов. Он рассматривает c, b, и a в таком порядке, и
b является последней записью в этом списке, которая является matrix объект.
Правила приведения типов#
Правила приведения типов претерпели некоторые изменения в крайних случаях из-за работы, связанной с NA. В частности, для комбинаций скаляр+скаляр:
the longlong тип (q) теперь остается longlong для операций с любым другим числом (? b h i l q p B H I), ранее он приводился как int_ (l). ulonglong тип (Q) теперь остается как ulonglong вместо uint (L).
the timedelta64 тип (m) теперь можно смешивать с любым целочисленным типом (b h i l q p B H I L Q P), ранее вызывал TypeError.
Для массив + скаляр, приведённые выше правила просто применяют трансляцию, за исключением случая, когда массив и скаляры являются целыми числами без знака/со знаком, тогда результат преобразуется к типу массива (возможно, большего размера), как показано в следующих примерах:
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(257)).dtype
dtype('uint16')
>>> (np.zeros((2,), dtype=np.int8) + np.uint16(257)).dtype
dtype('int16')
>>> (np.zeros((2,), dtype=np.int16) + np.uint32(2**17)).dtype
dtype('int32')
Увеличивается ли размер, зависит от размера скаляра, например:
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(255)).dtype
dtype('uint8')
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(256)).dtype
dtype('uint16')
Также complex128 скаляр + float32 массив приводится к complex64.
В NumPy 1.7 datetime64 тип (M) должен быть создан путем явного
указания типа в качестве второго аргумента (например, np.datetime64(2000, 'Y')).
Устаревшие функции#
Общее#
Указание пользовательского форматирования строк с помощью _format атрибут array устарел. Новый formatter ключевое слово в numpy.set_printoptions или
numpy.array2string может быть использован вместо этого.
Устаревшие импорты в пакете polynomial были удалены.
concatenate теперь вызывает DepractionWarning для 1D массивов, если axis != 0. Версии numpy < 1.7.0 игнорировали значение аргумента axis для 1D массивов. Мы пока это допускаем, но в должное время вызовем ошибку.
C-API#
Прямой доступ к полям PyArrayObject* устарел. Прямой доступ не рекомендовался в течение многих релизов. Ожидайте аналогичного устаревания для PyArray_Descr* и других основных объектов в будущем в рамках подготовки к NumPy 2.0.
Макросы в old_defines.h устарели и будут удалены в следующем основном релизе (>= 2.0). Скрипт sed tools/replace_old_macros.sed можно использовать для замены этих макросов на более новые версии.
Вы можете протестировать свой код на устаревшем C API, добавив строку, состоящую из #define NPY_NO_DEPRECATED_API и целевой номер версии,
например, NPY_1_7_API_VERSION, перед включением любых заголовков NumPy.
The NPY_CHAR член NPY_TYPES enum устарел и будет удален в NumPy 1.8. См. обсуждение на
gh-2801 для получения дополнительной информации.