Примечания к выпуску NumPy 1.14.0#
Numpy 1.14.0 — результат семи месяцев работы и содержит большое количество исправлений ошибок и новых функций, а также несколько изменений с потенциальными проблемами совместимости. Основное изменение, которое заметят пользователи, — стилистические изменения в способе печати массивов и скаляров numpy, изменение, которое повлияет на doctests. Подробности о том, как сохранить старый стиль печати при необходимости, см. ниже.
Важное решение, влияющее на будущую разработку, касается графика прекращения поддержки Python 2.7 в преддверии 2020 года. Было принято решение поддерживать 2.7 во всех выпусках 2018 года, причём последний выпуск будет обозначен как долгосрочный с поддержкой исправлений ошибок до конца 2019 года. В 2019 году поддержка 2.7 будет прекращена во всех новых выпусках. Подробности можно найти в NEP 12.
Эта версия поддерживает Python 2.7 и 3.4 - 3.6.
Основные моменты#
The np.einsum Более общо
genfromtxt,loadtxt,fromregexиsavetxtтеперь может обрабатывать файлы с произвольной кодировкой, поддерживаемой Python.Значительные улучшения в выводе массивов и скаляров NumPy.
Новые функции#
parametrize: декоратор добавлен в numpy.testingchebinterpolate: Интерполяция функции в точках Чебышёва.format_float_positionalиformat_float_scientific: формат скаляров с плавающей точкой однозначно с контролем округления и заполнения.PyArray_ResolveWritebackIfCopyиPyArray_SetWritebackIfCopyBase, новые функции C-API, полезные для достижения совместимости с PyPy.
Устаревшие функции#
Используя
np.bool_объектов вместо целых чисел устарело. Ранееoperator.index(np.bool_)был допустим и разрешал конструкции, такие как[1, 2, 3][np.True_]. Это было вводящим в заблуждение, так как он вел себя иначе, чемnp.array([1, 2, 3])[np.True_].Проверка истинности пустого массива устарела. Чтобы проверить, не пуст ли массив, используйте
array.size > 0.Вызов
np.bincountсminlength=Noneустарело.minlength=0следует использовать вместо.Вызов
np.fromstringсо значением по умолчаниюsepаргумент устарел. Когда этот аргумент не предоставлен, используется сломанная версияnp.frombufferиспользуется, который молча принимает строки Unicode и - после их кодировки как utf-8 (python 3) или кодировки по умолчанию (python 2) - обрабатывает их как двоичные данные. Если требуется чтение двоичных данных,np.frombufferдолжен использоваться напрямую.The
styleопция array2string устарела в не-унаследованном режиме печати.PyArray_SetUpdateIfCopyBaseбыл устаревшим. Для версий NumPy >= 1.14 используйтеPyArray_SetWritebackIfCopyBaseвместо этого, см. Изменения в C API ниже для подробностей.Использование
UPDATEIFCOPYмассивов устарело, см. Изменения в C API ниже для подробностей. Мы не будем прекращать поддержку этих массивов, но они несовместимы с PyPy.
Будущие изменения#
np.issubdtypeпрекратит понижающее приведение аргументов, подобных dtype. Можно ожидать, чтоissubdtype(np.float32, 'float64')иissubdtype(np.float32, np.float64)означают одно и то же - однако был недокументированный особый случай, который преобразовывал первое вissubdtype(np.float32, np.floating), что даёт удивительный результат True.Это преобразование теперь выдаёт предупреждение, объясняющее, какое преобразование происходит. В будущем преобразование будет отключено, и первый пример будет сделан эквивалентным второму.
np.linalg.lstsqпо умолчанию дляrcondбудет изменен.rcondпараметр дляnp.linalg.lstsqизменит значение по умолчанию на машинную точность, умноженную на наибольшую из размерностей входного массива. FutureWarning выдается, когдаrcondне передаётся явно.a.flat.__array__()вернёт записываемую копиюaкогдаaявляется несмежным. Ранее он возвращал массив UPDATEIFCOPY, когдаaбыл доступен для записи. В настоящее время возвращается копия, недоступная для записи. См. gh-7054 для обсуждения проблемы.Неструктурированного пустого массива
.itemметод вернет объект bytes. В будущем вызов.item()на массивах или скалярахnp.voidтип данных вернётbytesобъект вместо буфера или целочисленного массива, такой же, как возвращаетсяbytes(void_scalar). Это может повлиять на код, который предполагал, что возвращаемое значение изменяемо, что больше не будет так.FutureWarningтеперь выдается, когда это происходит.
Примечания по совместимости#
Маска представления маскированного массива также является представлением, а не копией#
Было предупреждение FutureWarning об этом изменении в NumPy 1.11.x. Вкратце, теперь
имеет место, что при изменении представления маскированного массива изменения маски
распространяются на оригинал. Ранее это было не так. Это изменение
затрагивает, в частности, срезы. Обратите внимание, что это ещё не работает корректно, если
маска исходного массива nomask и маска представления изменяется.
См. gh-5580 для подробного обсуждения. Исходное поведение с копией
маски можно получить, вызвав unshare_mask метод представления.
np.ma.masked больше не доступен для записи#
Попытки изменить masked теперь вызывает ошибку, так как базовые массивы помечены как доступные только для чтения. Раньше можно было обойтись:
# emulating a function that sometimes returns np.ma.masked
val = random.choice([np.ma.masked, 10])
var_arr = np.asarray(val)
val_arr += 1 # now errors, previously changed np.ma.masked.data
np.ma функции, производящие fill_value изменились#
Ранее, np.ma.default_fill_value вернул бы 0d массив, но
np.ma.minimum_fill_value и np.ma.maximum_fill_value вернул бы кортеж полей. Вместо этого все три метода возвращают структурированный np.void
объект, который вы уже найдёте в .fill_value атрибут.
Кроме того, определение типа данных теперь соответствует np.array - поэтому при передаче скаляра Python x, maximum_fill_value(x) всегда такой же, как
maximum_fill_value(np.array(x)). Ранее x = long(1) в Python 2
нарушало это предположение.
a.flat.__array__() возвращает неизменяемые массивы, когда a не является непрерывным#
Цель состоит в том, что массив UPDATEIFCOPY, ранее возвращаемый, когда a был
не непрерывным, будет заменён на записываемую копию в будущем. Эта
временная мера направлена на уведомление тех, кто ожидает, что базовый массив будет
изменён в этой ситуации, что это больше не будет так. Наиболее
вероятные места, где это может быть замечено, — это когда выражения вида
np.asarray(a.flat) используются, или когда a.flat передается как параметр out в ufunc.
np.tensordot теперь возвращает нулевой массив при сокращении по измерению нулевой длины#
Ранее np.tensordot вызывал ValueError при сокращении по измерению нулевой длины.
Теперь возвращается нулевой массив, что согласуется с поведением np.dot и np.einsum.
numpy.testing реорганизован#
Это не должно вызывать проблем, но возможно, что-то было упущено. Если вы столкнулись с неожиданной проблемой импорта при использовании numpy.testing
дайте нам знать.
np.asfarray больше не принимает не-dtypes через параметр dtype аргумент#
Ранее это принимало dtype=some_array, с подразумеваемой семантикой
dtype=some_array.dtype. Это было недокументировано, уникально среди функций numpy, и если бы использовалось, вероятно, соответствовало бы опечатке.
1D np.linalg.norm сохраняет типы входных данных с плавающей точкой, даже для произвольных порядков#
Ранее это приводило к повышению до float64 когда передавались произвольные порядки,
несмотря на то, что этого не делалось в простых случаях:
>>> f32 = np.float32([[1, 2]])
>>> np.linalg.norm(f32, 2.0, axis=-1).dtype
dtype('float32')
>>> np.linalg.norm(f32, 2.0001, axis=-1).dtype
dtype('float64') # numpy 1.13
dtype('float32') # numpy 1.14
Это изменение затрагивает только float32 и float16 массивы.
count_nonzero(arr, axis=()) теперь считает по нулевым осям, а не по всем осям#
В других случаях, axis==() всегда понимается как "нет осей", но
Возвращает указатель данных, приведенный к определенному объекту c-типов. Например, вызов имел особый случай, чтобы рассматривать это как "все оси". Это было
несогласованно и удивительно. Правильный способ подсчёта по всем осям всегда
был передача axis == None.
__init__.py файлы, добавленные в тестовые директории#
Это для совместимости с pytest в случае дублирования имён тестовых файлов в разных директориях. В результате, run_module_suite больше не работает,
т.е., python приводит к ошибке.
.astype(bool) на неструктурированных void массивах теперь вызывает bool на каждом элементе#
В Python 2, void_array.astype(bool) всегда возвращал массив
True, если только dtype не V0. В Python 3 эта операция обычно приводит к сбою. В будущем, astype соответствует поведению bool(np.void), рассматривая буфер из всех нулей как ложь, а все остальное как истину. Проверяет V0 всё ещё можно сделать с помощью arr.dtype.itemsize == 0.
MaskedArray.squeeze никогда не возвращает np.ma.masked#
np.squeeze документирован как возвращающий представление, но маскированный вариант иногда
возвращал masked, который не является представлением. Это было исправлено, так что результат всегда является представлением исходного маскированного массива. Это ломает любой код, который использовал masked_arr.squeeze() is np.ma.masked, но
исправляет код, который записывает в результат squeeze().
Переименованный первый параметр can_cast из from to from_#
Предыдущее имя параметра from является зарезервированным ключевым словом в Python, что затрудняло передачу аргумента по имени. Это исправлено переименованием параметра в from_.
isnat вызывает TypeError при передаче неправильного типа#
Универсальная функция (ufunc) isnat использовался для вызова ValueError когда не были переданы переменные типа datetime или timedelta. Это было изменено на
вызов TypeError.
dtype.__getitem__ вызывает TypeError при передаче неправильного типа#
При индексации с плавающей запятой, dtype object ранее вызывал ValueError.
Пользовательские типы теперь должны реализовывать __str__ и __repr__#
Ранее пользовательские типы могли возвращаться к реализации по умолчанию
__str__ и __repr__ реализовано в numpy, но теперь это было
удалено. Теперь пользовательские типы будут возвращаться к стандартному поведению Python
object.__str__ и object.__repr__.
Многочисленные изменения в выводе массивов, отключаемые новым режимом печати "legacy"#
The str и repr ndarrays и numpy scalars были изменены различными способами. Эти изменения, вероятно, нарушат доктесты пользователей.
Эти новые поведения можно отключить, чтобы в основном воспроизвести поведение numpy 1.13, включив новый режим печати 1.13 "legacy". Это делается вызовом
np.set_printoptions(legacy="1.13"), или используя новый legacy аргумент для
np.array2string, как np.array2string(arr, legacy='1.13').
Вкратце, основные изменения:
Для типов с плавающей точкой:
The
reprмассивов float часто пропускает пробел, ранее печатаемый в позиции знака. См. новыйsignопция дляnp.set_printoptions.Массивы и скаляры с плавающей точкой используют новый алгоритм для десятичных представлений, дающий кратчайшее уникальное представление. Это обычно сокращает
float16дробный вывод, и иногдаfloat32иfloat128вывод.float64должны остаться без изменений. См. новыйfloatmodeопция дляnp.set_printoptions.Массивы с плавающей точкой, выводимые в научной нотации, больше не используют фиксированную точность, и теперь вместо этого показывают кратчайшее уникальное представление.
The
strскаляров с плавающей точкой больше не обрезается в python2.
Для других типов данных:
Не конечные комплексные скаляры выводятся как
nanjвместоnan*j.NaTзначения в массивах datetime теперь правильно выровнены.Массивы и скаляры
np.voidтипы данных теперь выводятся с использованием шестнадцатеричной нотации.
Для переноса строк:
Часть "dtype" в repr ndarray теперь будет выводиться на следующей строке, если на последней строке вывода массива нет места.
The
linewidthпараметр format теперь всегда учитывается. Параметр repr или str массива никогда не превысит это, если только один элемент не слишком широк.Последняя строка строки массива никогда не будет содержать больше элементов, чем предыдущие строки.
Дополнительный пробел больше не вставляется в первой строке, если элементы слишком широкие.
Для суммирования (использование
...для сокращения длинных массивов):Запятая в конце больше не вставляется для
str. Ранее,str(np.arange(1001))дал'[ 0 1 2 ..., 998 999 1000]', который имеет лишнюю запятую.Для массивов 2-D и выше, когда
...выводится на отдельной строке для суммирования любых осей, кроме последней, теперь к этой строке добавляются символы новой строки, чтобы соответствовать её начальным символам новой строки, и удаляется завершающий пробел.
MaskedArrayмассивы теперь разделяют печатаемые элементы запятыми, всегда печатают dtype и правильно переносят элементы длинных массивов на несколько строк. Если измерений больше 1, атрибуты массива теперь печатаются в новом стиле печати 'с выравниванием по левому краю'.recarrayмассивы больше не выводят завершающий пробел перед своим dtype и переносятся на правильное количество столбцов.0d массивы больше не имеют своих уникальных реализаций
strиrepr.styleаргумент дляnp.array2stringустарело.Массивы
boolтип данных опустит тип данных вrepr.Пользовательский
dtypes(подклассыnp.generic) теперь должны реализовывать__str__и__repr__.
Некоторые из этих изменений описаны более подробно ниже. Если вам нужно сохранить предыдущее поведение для тестов документации или других причин, вы можете сделать что-то вроде:
# FIXME: We need the str/repr formatting used in Numpy < 1.14.
try:
np.set_printoptions(legacy='1.13')
except TypeError:
pass
Изменения в C API#
Совместимая с PyPy альтернатива UPDATEIFCOPY массивы#
UPDATEIFCOPY массивы являются непрерывными копиями существующих массивов, возможно, с другими размерностями, содержимое которых копируется обратно в исходный массив, когда их счётчик ссылок достигает нуля и они освобождаются. Поскольку PyPy не использует счётчики ссылок, они не работают корректно с PyPy. NumPy находится в процессе устранения их использования внутри, и две новые функции C-API,
PyArray_SetWritebackIfCopyBasePyArray_ResolveWritebackIfCopy,
были добавлены вместе с дополнительным флагом,
NPY_ARRAY_WRITEBACKIFCOPY. Использование новой функциональности также требует изменения некоторых флагов при создании новых массивов, а именно:
NPY_ARRAY_INOUT_ARRAY должен быть заменен на NPY_ARRAY_INOUT_ARRAY2 и
NPY_ARRAY_INOUT_FARRAY должен быть заменен на NPY_ARRAY_INOUT_FARRAY2. Массивы, созданные с этими новыми флагами, будут иметь WRITEBACKIFCOPY
семантика.
Если совместимость с PyPy не является проблемой, эти новые функции можно игнорировать, хотя будет DeprecationWarning. Если вы хотите добиться совместимости с PyPy, дополнительную информацию об этих функциях и их использовании можно найти в c-api документация и пример в how-to-extend.
Новые возможности#
Аргумент кодировки для функций текстового ввода-вывода#
genfromtxt, loadtxt, fromregex и savetxt теперь может обрабатывать файлы с произвольной кодировкой, поддерживаемой Python, через аргумент encoding. Для обратной совместимости аргумент по умолчанию имеет специальное значение bytes значение
которое продолжает обрабатывать текст как необработанные байтовые значения и продолжает передавать latin1
закодированные байты пользовательским преобразователям.
Использование любого другого значения (включая None для системного значения по умолчанию) переключит
функции на реальный текстовый ввод-вывод, так что в результирующих массивах будут получены строки Unicode вместо байтов.
Внешний nose плагины могут использоваться numpy.testing.Tester#
numpy.testing.Tester теперь учитывает nose плагины, которые находятся вне
nose встроенных. Это позволяет использовать, например, nose-timer вот так: np.test(extra_argv=['--with-timer', '--timer-top-n', '20']) для
получения времени выполнения 20 самых медленных тестов. Дополнительное ключевое слово timer также был добавлен в Tester.test, поэтому np.test(timer=20) также сообщит о 20
самых медленных тестах.
parametrize декоратор, добавленный к numpy.testing#
Базовый parametrize декоратор теперь доступен в numpy.testing. Он предназначен для переписывания тестов на основе yield, которые были устаревшими в pytest, чтобы облегчить переход на pytest в будущем. Фреймворк тестирования nose не поддерживался в течение нескольких лет и выглядит как заброшенное ПО.
Новый parametrize декоратор не обладает полной функциональностью
аналогичного в pytest. Он не работает для классов, не поддерживает вложенность и не
подставляет имена переменных. Тем не менее, его должно быть достаточно для переписывания
тестов NumPy.
chebinterpolate функция добавлена в numpy.polynomial.chebyshev#
Новый chebinterpolate функция интерполирует заданную функцию в
точках Чебышёва первого рода. Новый Chebyshev.interpolate метод класса добавляет поддержку интерполяции по произвольным интервалам с использованием масштабированных и сдвинутых точек Чебышева первого рода.
Поддержка чтения текстовых файлов, сжатых lzma, в Python 3#
С версиями Python, содержащими lzma модуль, текстовые функции ввода-вывода теперь
могут прозрачно читать из файлов с xz или lzma расширение.
sign опция добавлена в np.setprintoptions и np.array2string#
Эта опция управляет выводом знака для типов с плавающей запятой и может быть одним из символов '-', '+' или ' '. При '+' numpy всегда выводит знак положительных значений, при ' ' всегда выводит пробел (символ пробела) в позиции знака для положительных значений, а при '-' он будет опускать символ знака для положительных значений. Новое значение по умолчанию - '-'.
Это новое значение по умолчанию изменяет вывод чисел с плавающей точкой по сравнению с numpy 1.13. Старое поведение можно получить в режиме печати "legacy" в 1.13, см. примечания о совместимости выше.
hermitian опция добавлена в np.linalg.matrix_rank#
Новый hermitian опция позволяет выбирать между стандартным расчетом ранга матрицы на основе SVD и более эффективным методом на основе собственных значений для симметричных/эрмитовых матриц.
threshold и edgeitems опции добавлены в np.array2string#
Эти параметры ранее можно было контролировать с помощью np.set_printoptions, но теперь могут быть изменены для каждого вызова как аргументы в np.array2string.
concatenate и stack получил out аргумент#
Теперь можно использовать предварительно выделенный буфер нужного типа данных для вывода этих функций.
Поддержка компилятора PGI flang на Windows#
Компилятор PGI flang — это фронтенд Fortran для LLVM, выпущенный NVIDIA под лицензией Apache 2. Его можно вызвать с помощью
python setup.py config --compiler=clang --fcompiler=flang install
Опыт использования этого нового компилятора невелик, поэтому любая обратная связь от людей, использующих его, будет оценена.
Улучшения#
Числитель степеней свободы в random.noncentral_f должны быть только положительными.#
До NumPy 1.14.0 степени свободы числителя должны были быть > 1, но распределение действительно для значений > 0, что является новым требованием.
GIL освобождается для всех np.einsum вариации#
Некоторые конкретные структуры циклов, которые имеют ускоренную версию цикла, не освобождали GIL до NumPy 1.14.0. Это упущение было исправлено.
The np.einsum функция будет использовать BLAS, когда это возможно, и оптимизировать по умолчанию#
The np.einsum функция теперь будет вызывать np.tensordot когда это уместно.
Поскольку np.tensordot использует BLAS, когда это возможно, что ускорит выполнение.
По умолчанию, np.einsum также попытается оптимизировать, так как накладные расходы малы по сравнению с потенциальным улучшением скорости.
f2py теперь обрабатывает массивы размерности 0#
f2py теперь позволяет выделять массивы размерности 0. Это позволяет
более последовательно обрабатывать крайние случаи в дальнейшем.
numpy.distutils поддерживает использование MSVC и mingw64-gfortran вместе#
Numpy distutils теперь поддерживает совместное использование компиляторов Mingw64 gfortran и MSVC. Это позволяет создавать модули расширения Python на Windows, содержащие код на Fortran, сохраняя совместимость с бинарными файлами, распространяемыми Python.org. Не все случаи использования поддерживаются, но большинство распространённых способов обёртки Fortran для Python работают.
Компиляция в этом режиме обычно включается автоматически и может быть выбрана через --fcompiler и --compiler опции для
setup.py. Кроме того, поддерживается связывание кодов Fortran со статической библиотекой OpenBLAS; по умолчанию используется статический архив, совместимый с gfortran
openblas.a ищется.
np.linalg.pinv теперь работает со сложенными матрицами#
Ранее это было ограничено одним двумерным массивом.
numpy.save выравнивает данные до 64 байт вместо 16#
Сохранение массивов NumPy в npy формат с numpy.save вставляет заполнение перед данными массива для выравнивания по 64 байтам. Ранее это было только 16 байт (а иногда меньше из-за ошибки в коде для версии 2). Теперь выравнивание составляет 64 байта, что соответствует самому широкому набору инструкций SIMD, обычно доступному, а также наиболее распространенному размеру строки кэша. Это делает npy файлы проще использовать в
программах, которые открывают их с помощью mmap, особенно в Linux, где
mmap смещение должно быть кратно размеру страницы.
NPZ файлы теперь могут быть записаны без использования временных файлов#
В Python 3.6+ numpy.savez и numpy.savez_compressed теперь записывают
напрямую в ZIP-файл без создания промежуточных временных файлов.
Улучшенная поддержка пустых структурированных и строковых типов#
Структурированные типы могут содержать ноль полей, а строковые типы данных могут содержать ноль символов. Строки нулевой длины всё ещё не могут быть созданы напрямую и должны быть созданы через структурированные типы данных:
str0 = np.empty(10, np.dtype([('v', str, N)]))['v']
void0 = np.empty(10, np.void)
Работа с ними всегда была возможна, но теперь для этих массивов поддерживаются следующие операции:
arr.sort()
arr.view(bytes)
arr.resize(…)
pickle.dumps(arr)
Поддержка decimal.Decimal в np.lib.financial#
Если не указано иное, все функции в financial пакет теперь
поддерживает использование decimal.Decimal встроенный тип.
Печать чисел с плавающей точкой теперь использует алгоритм «dragon4» для кратчайшего десятичного представления#
The str и repr чисел с плавающей запятой (16, 32, 64 и 128 бит) теперь выводятся в кратчайшем десятичном представлении, которое однозначно идентифицирует значение среди других значений того же типа. Ранее это было верно только для float64 значения. Оставшиеся типы float теперь часто будут короче,
чем в numpy 1.13. Массивы, выводимые в научной нотации, теперь также используют
кратчайшее научное представление, вместо фиксированной точности, как раньше.
Кроме того, str скаляров с плавающей точкой скаляры больше не будут усекаться в python2, в отличие от python2 floats. np.double скаляры теперь имеют
strиreprидентично таковому у python3 float.
Новые функции np.format_float_scientific и np.format_float_positional
предоставлены для генерации этих десятичных представлений.
Новая опция floatmode был добавлен в np.set_printoptions и
np.array2string, который дает контроль над уникальностью и округлением
печатаемых элементов в массиве. Новое значение по умолчанию — floatmode='maxprec' с
precision=8, которое будет выводить не более 8 дробных цифр или меньше, если элемент может быть однозначно представлен с меньшим количеством. Полезный новый режим —
floatmode="unique", который выведет достаточно цифр, чтобы однозначно определить элементы массива.
Комплексные скаляры Numpy со значениями, такими как inf*j или nan*j теперь
печатается как infj и nanj, как в чистом Python complex тип.
The FloatFormat и LongFloatFormat классы устарели и должны
быть заменены на FloatingFormat. Аналогично ComplexFormat и
LongComplexFormat должен быть заменен на ComplexFloatingFormat.
void элементы типа данных теперь выводятся в шестнадцатеричной нотации#
Шестнадцатеричное представление, совместимое с python bytes тип теперь выводится
для неструктурированных np.void элементы, например, V4 datatype. Ранее, в python2 необработанные данные элемента выводились в stdout, или в python3 отображались целочисленные значения байтов.
стиль печати для void типы данных теперь настраиваются независимо#
Стиль печати np.void массивов теперь можно настраивать независимо с помощью formatter аргумент для np.set_printoptions, используя
'void' ключ, вместо универсального numpystr ключ как раньше.
Сниженное использование памяти np.loadtxt#
np.loadtxt теперь читает файлы частями вместо полной загрузки, что значительно снижает
использование памяти для больших файлов.
Изменения#
Многополевая индексация/присваивание структурированных массивов#
Индексирование и присваивание структурированных массивов с несколькими полями изменилось несколькими способами, как предупреждалось в предыдущих выпусках.
Во-первых, индексация структурированного массива с несколькими полями, например,
arr[['f1', 'f3']], возвращает представление исходного массива вместо
копии. Возвращаемое представление будет иметь дополнительные байты заполнения, соответствующие
промежуточным полям в исходном массиве, в отличие от копии в 1.13, что может
повлиять на код, такой как arr[['f1', 'f3']].view(newdtype).
Во-вторых, присваивание между структурированными массивами теперь будет происходить "по позиции" вместо "по имени поля". N-е поле назначения будет установлено в N-е поле источника независимо от имени поля, в отличие от версий numpy 1.6–1.13, где поля в целевом массиве устанавливались в одноименное поле в исходном массиве или в 0, если источник не имел такого поля.
Соответственно, порядок полей в структурированных типах данных теперь имеет значение при вычислении равенства типов. Например, с типами данных
x = dtype({'names': ['A', 'B'], 'formats': ['i4', 'f4'], 'offsets': [0, 4]})
y = dtype({'names': ['B', 'A'], 'formats': ['f4', 'i4'], 'offsets': [4, 0]})
выражение x == y теперь вернет False, в отличие от предыдущего.
Это делает спецификации dtype на основе словаря, такие как
dtype({'a': ('i4', 0), 'b': ('f4', 4)}) опасно в Python < 3.6, поскольку порядок ключей словаря не сохраняется в этих версиях.
Присваивание из структурированного массива в логический массив теперь вызывает ValueError, в отличие от версии 1.13, где оно всегда устанавливало элементы назначения в True.
Присваивание из структурированного массива с более чем одним полем в неструктурированный массив теперь вызывает ValueError. В версии 1.13 это копировало только первое поле источника в назначение.
Использование поля "titles" при индексировании по нескольким полям теперь запрещено, как и повторение имени поля в составном индексе.
Документация по структурированным массивам в руководстве пользователя была значительно обновлена, чтобы отразить эти изменения.
Целочисленные и пустые скаляры теперь не подвержены влиянию np.set_string_function#
Ранее, в отличие от большинства других скаляров numpy, str и repr целочисленных и пустых скаляров может контролироваться np.set_string_function.
Это больше невозможно.
изменена печать 0d массивов, style аргумент array2string устарел#
Ранее str и repr 0d массивов имели идиосинкразические
реализации, которые возвращали str(a.item()) и 'array(' +
repr(a.item()) + ')' соответственно для массива 0d a, в отличие от скаляров numpy и ndarrays более высокой размерности.
Теперь, str 0d массива ведёт себя как скаляр numpy, используя str(a[()])
и repr ведет себя как массивы более высокой размерности, используя formatter(a[()]),
где formatter может быть указан с помощью np.set_printoptions.
style аргумент np.array2string устарело.
Это новое поведение отключено в режиме устаревшего вывода 1.13, см. примечания о совместимости выше.
Инициализация генератора случайных чисел RandomState использование массива требует одномерного массива#
RandomState ранее принимали пустые массивы или массивы с 2 или более
измерениями, что приводило либо к неудаче при инициализации (пустые массивы), либо к
игнорированию некоторых переданных значений при установке начального значения.
MaskedArray objects показывают более полезную repr#
The repr из MaskedArray теперь ближе к коду Python, который бы его создал, с массивами, теперь отображаемыми с запятыми и типами данных. Как и другие изменения форматирования, это можно отключить с помощью режима печати версии 1.13, чтобы помочь в переходе doctests.
The repr of np.polynomial классы более явные#
Теперь он показывает параметры домена и окна в качестве ключевых аргументов, чтобы сделать их более понятными:
>>> np.polynomial.Polynomial(range(4))
Polynomial([0., 1., 2., 3.], domain=[-1, 1], window=[-1, 1])