Примечания к выпуску NumPy 1.18.0#

В дополнение к обычным исправлениям ошибок, этот выпуск NumPy очищает и документирует новый случайный C-API, отменяет большое количество старых устаревших функций и улучшает внешний вид документации. Поддерживаемые версии Python — 3.5-3.8. Это последняя серия выпусков NumPy, которая будет поддерживать Python 3.5.

Разработчикам нижестоящих проектов следует использовать Cython >= 0.29.14 для поддержки Python 3.8 и OpenBLAS >= 3.7, чтобы избежать проблем на архитектуре Skylake.

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

  • C-API для numpy.random было определено и задокументировано.

  • Базовая инфраструктура для линковки с 64-битными библиотеками BLAS и LAPACK.

  • Многочисленные улучшения документации.

Новые функции#

Многомерное гипергеометрическое распределение добавлено в numpy.random#

Метод multivariate_hypergeometric был добавлен в класс numpy.random.Generator. Этот метод генерирует случайные величины из многомерного гипергеометрического распределения вероятностей. (gh-13794)

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

np.fromfile и np.fromstring выдаст ошибку при некорректных данных#

В будущих выпусках numpy функции np.fromfile и np.fromstring выдаст ошибку при разборе некорректных данных. Теперь это даст DeprecationWarning где ранее частичные или даже недействительные данные возвращались без предупреждения. Это устаревание также затрагивает функции, определённые в C PyArray_FromString и PyArray_FromFile (gh-13605)

Устаревание нескалярных массивов в качестве значений заполнения в ma.fill_value#

Установка MaskedArray.fill_value в нескалярный массив устарело, поскольку логика трансляции заполняющего значения в массив ненадежна, особенно при срезе. (gh-13698)

Устарело PyArray_As1D, PyArray_As2D#

PyArray_As1D, PyArray_As2D устарели, используйте PyArray_AsCArray вместоgh-14036)

Устарело np.alen#

np.alen был устаревшим. Используйте len вместо. (gh-14181)

Устарели финансовые функции#

В соответствии с NEP-32, финансовые функции fv ipmt, irr, mirr, nper, npv, pmt, ppmt, pv и rate устарели и будут удалены из NumPy 1.20. Замена для этих функций — пакет Python numpy-financial. (gh-14720)

The axis аргумент для numpy.ma.mask_cols и numpy.ma.mask_row устарел#

Этот аргумент всегда игнорировался. (gh-14996)

Устаревшие устаревания#

  • PyArray_As1D и PyArray_As2D были удалены в пользу PyArray_AsCArray (gh-14036)

  • np.rank был удален. Это было устаревшим в NumPy 1.10 и заменено на np.ndim. (gh-14039)

  • Устаревание expand_dims оси вне диапазона в 1.13.0 истекли. (gh-14051)

  • PyArray_FromDimsAndDataAndDescr и PyArray_FromDims были удалены (они всегда будут вызывать ошибку). Используйте PyArray_NewFromDescr и PyArray_SimpleNew вместо. (gh-14100)

  • numeric.loads, numeric.load, np.ma.dump, np.ma.dumps, np.ma.load, np.ma.loads удалены, используйте pickle методы вместоgh-14256)

  • arrayprint.FloatFormat, arrayprint.LongFloatFormat был удален, используйте FloatingFormat вместо

  • arrayprint.ComplexFormat, arrayprint.LongComplexFormat был удален, используйте ComplexFloatingFormat вместо

  • arrayprint.StructureFormat был удален, используйте StructureVoidFormat вместоgh-14259)

  • np.testing.rand был удален. Это было устаревшим в NumPy 1.11 и заменено на np.random.rand. (gh-14325)

  • Класс SafeEval в numpy/lib/utils.py был удален. Это было устаревшим в NumPy 1.10. Используйте np.safe_eval вместо. (gh-14335)

  • Удалена устаревшая поддержка булевых и пустых списков условий в np.select (gh-14583)

  • Порядок массива принимает только 'C', 'F', 'A' и 'K'. Более разрешительные варианты были устаревшими в NumPy 1.11. (gh-14596)

  • параметр np.linspace num должно быть целым числом. Устарело в NumPy 1.12. (gh-14620)

  • UFuncs с несколькими выходами должны использовать кортеж для out kwarg. Это завершает устаревание, начатое в NumPy 1.10. (gh-14682)

Файлы numpy/testing/decorators.py, numpy/testing/noseclasses.py и numpy/testing/nosetester.py были удалены. Они никогда не предназначались для публичного использования (все соответствующие объекты присутствуют в numpy.testing пространство имён), и их импорт выдавал предупреждение об устаревании с NumPy 1.15.0 (gh-14567)

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

numpy.lib.recfunctions.drop_fields больше не может возвращать None#

Если drop_fields используется для удаления всех полей, ранее массив полностью отбрасывался и возвращался None. Теперь он возвращает массив той же формы, что и входной, но без полей. Старое поведение можно сохранить с помощью:

dropped_arr = drop_fields(arr, ['a', 'b'])
if dropped_arr.dtype.names == ():
    dropped_arr = None

преобразование пустого recarray в None (gh-14510)

numpy.argmin/argmax/min/max возвращает NaT если он существует в массиве#

numpy.argmin, numpy.argmax, numpy.min, и numpy.max вернет NaT если он существует в массиве. (gh-14717)

np.can_cast(np.uint64, np.timedelta64, casting='safe') теперь False#

Ранее это было True - однако это было несовместимо с uint64 не может быть безопасно приведён к int64, и приводя к странному разрешению типов.

Если это влияет на ваш код, приведите uint64 to int64 сначала. (gh-14718)

Изменен поток случайных величин с numpy.random.Generator.integers#

Была ошибка в numpy.random.Generator.integers который вызывал смещённую выборку 8- и 16-битных целочисленных типов. Исправление этой ошибки изменило поток вывода по сравнению с предыдущими выпусками. (gh-14777)

Добавить больше циклов ufunc для datetime64, timedelta64#

np.datetime('NaT') должен вести себя больше как float('Nan'). Добавить необходимую инфраструктуру, чтобы np.isinf(a) и np.isnan(a) будет работать на datetime64 и timedelta64 dtypes. Также добавлены специальные циклы для numpy.fmin и numpy.fmax эта маска NaT. Это может потребовать корректировки пользовательского кода. В частности, кода, который либо запрещал вызовы numpy.isinf или numpy.isnan или проверяли, что они вызывают исключение, потребуют адаптации, а код, который ошибочно вызывал numpy.fmax и numpy.fmin вместо numpy.maximum или numpy.minimum соответственно потребуют корректировки. Это также влияет на numpy.nanmax и numpy.nanmin. (gh-14841)

Перемещённые модули в numpy.random#

В рамках очистки API подмодули в numpy.random bit_generator, philox, pcg64, sfc64, common, generator, и bounded_integers были перемещены в _bit_generator, _philox, _pcg64, _sfc64, _common, _generator, и _bounded_integers соответственно, чтобы указать, что они не являются частью публичного интерфейса. (gh-14608)

Изменения в C API#

PyDataType_ISUNSIZED(descr) теперь возвращает False для структурированных типов данных#

Ранее это возвращало True для любого типа данных с размером элемента 0, но теперь возвращает false для негибкого типа данных с размером элемента 0, np.dtype([]). (gh-14393)

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

Добавить наш собственный *.pxd файл импорта cython#

Добавлен numpy/__init__.pxd файл. Он будет использоваться для cimport numpy (gh-12284)

Теперь можно вводить кортеж осей в expand_dims#

The numpy.expand_dims axis ключевое слово теперь может принимать кортеж осей. Ранее axis должно было быть целым числом. (gh-14051)

Поддержка 64-битного OpenBLAS#

Добавлена поддержка 64-битного (ILP64) OpenBLAS. См. site.cfg.example подробности. (gh-15012)

Добавить --f2cmap опция для F2PY#

Позволяет указать файл для загрузки пользовательских сопоставлений типов Fortran-to-C. (gh-15113)

Улучшения#

Различные числовые типы C одинакового размера имеют уникальные имена#

На любой заданной платформе, два из np.intc, np.int_, и np.longlong ранее выглядели неразличимыми через их repr, несмотря на их соответствующие dtype имеющие разные свойства. Аналогичная проблема существовала для беззнаковых аналогов этих типов, и на некоторых платформах для np.double и np.longdouble

Эти типы теперь всегда выводятся с уникальным __name__. (gh-10151)

argwhere теперь даёт согласованный результат на 0d массивах#

На N-мерных массивах, numpy.argwhere теперь всегда создаёт массив формы (n_non_zero, arr.ndim), даже когда arr.ndim == 0. Ранее последняя ось имела бы размерность 1 в этом случае. (gh-13610)

Добавить axis аргумент для random.permutation и random.shuffle#

Ранее random.permutation и random.shuffle функции могут перемешивать массив только вдоль первой оси; теперь у них есть новый аргумент axis будет 1, при этом результирующий массив имеет ту же форму, что иgh-13829)

method именованный аргумент для np.random.multivariate_normal#

A method аргумент ключевого слова теперь доступен для np.random.multivariate_normal с возможными значениями {'svd', 'eigh', 'cholesky'}. Чтобы использовать его, напишите np.random.multivariate_normal(..., method=). (gh-14197)

Добавить поддержку комплексных чисел для numpy.fromstring#

Теперь numpy.fromstring может читать комплексные числа. (gh-14227)

numpy.unique имеет согласованный порядок осей, когда axis не является None#

Используя moveaxis вместо swapaxes в numpy.unique, чтобы порядок осей, кроме оси в аргументах, не был нарушен. (gh-14255)

numpy.matmul с булевым выводом теперь преобразуется в булевы значения#

Вызов numpy.matmul где выходной массив является булевым, заполнял бы массив эквивалентами uint8 результата, а не 0/1. Теперь он принудительно устанавливает выходные значения в 0 или 1 (NPY_TRUE или NPY_FALSE). (gh-14464)

numpy.random.randint выдавало некорректное значение, когда диапазон был 2**32#

Реализация, представленная в версии 1.17.0, имела некорректную проверку при определении, использовать ли 32-битный путь или полный 64-битный путь, которая неправильно перенаправляла генерацию случайных целых чисел с диапазоном high - low 2**32 к 64-битному генератору. (gh-14501)

Добавить поддержку комплексных чисел для numpy.fromfile#

Теперь numpy.fromfile может читать комплексные числа. (gh-14730)

std=c99 добавлено, если компилятор назван gcc#

GCC до версии 5 требует -std=c99 аргумент командной строки. Новые компиляторы автоматически включают режим C99. Код настройки компилятора автоматически добавит код, если имя компилятора содержит gcc в нём. (gh-14771)

Изменения#

NaT теперь сортируется в конец массивов#

NaT теперь фактически рассматривается как наибольшее целое число для целей сортировки, так что оно сортируется в конец массивов. Это изменение сделано для согласованности с NaN поведение сортировки. (gh-12658) (gh-15068)

Некорректный threshold в np.set_printoptions вызывает TypeError или ValueError#

Ранее некорректный threshold вызвано ValueError; теперь вызывает TypeError для нечисловых типов и ValueError для nan значения. (gh-13899)

Предупреждать при сохранении типа данных с метаданными#

A UserWarning будет выдан при сохранении массива через numpy.save с metadata. Сохранение такого массива может не сохранить метаданные, и если метаданные сохраняются, их загрузка вызовет ValueError. Этот недостаток в save и load будет исправлен в будущем выпуске. (gh-14142)

numpy.distutils изменено поведение append для LDFLAGS и аналогичных#

numpy.distutils всегда перезаписывал, а не добавлял к LDFLAGS и другими аналогичными переменными окружения для компиляции расширений Fortran. Теперь поведение по умолчанию изменилось на добавление — что является ожидаемым поведением в большинстве ситуаций. Чтобы сохранить старое поведение (перезапись), установите NPY_DISTUTILS_APPEND_FLAGS переменную окружения в 0. Это относится к: LDFLAGS, F77FLAGS, F90FLAGS, FREEFLAGS, FOPT, FDEBUG, и FFLAGS. NumPy 1.16 и 1.17 выдавали предупреждения при сборке в ситуациях, когда это изменение в поведении повлияло бы на используемые флаги компиляции. (gh-14248)

Удалить numpy.random.entropy без устаревания#

numpy.random.entropy был добавлен в numpy.random пространство имён в версии 1.17.0. Оно предназначалось как приватный c-расширяемый модуль, но было открыто как публичный. Заменено на numpy.random.SeedSequence поэтому модуль был полностью удален. (gh-14498)

Добавить опции для тихой конфигурации сборки и сборки с -Werror#

Добавлены две новые опции конфигурации. Во время build_src подкоманда, как часть настройки NumPy, файлы _numpyconfig.h и config.h создаются путем проверки поддержки различных функций и процедур времени выполнения. Ранее очень подробный вывод компилятора на этом этапе затмевал более важную информацию. По умолчанию вывод отключен. Запуск runtests.py --debug-info добавит --verbose-cfg в build_src подкоманда, которая восстановит предыдущее поведение.

Добавление CFLAGS=-Werror превращение предупреждений в ошибки вызывало бы ошибки во время конфигурации. Теперь runtests.py --warn-error добавит --warn-error в build подкоманда, которая будет передана в build_ext и build_lib подкоманды. Это добавит флаг компилятора к этим этапам и превратит предупреждения компилятора в ошибки при фактической сборке самого NumPy, избегая build_src вызовы подкоманд компилятора.

(gh-14527) (gh-14518)