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

Этот выпуск поддерживает Python 2.6 - 2.7 и 3.2 - 3.5 и содержит ряд улучшений и доработок. Также обратите внимание на изменения в системе сборки, перечисленные ниже, так как они могут иметь тонкие эффекты.

Для этого выпуска не предоставляются бинарные файлы для Windows (TM) из-за сломанной цепочки инструментов. Один из поставщиков пакетов Python для Windows (TM) — ваш лучший вариант.

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

Подробности этих улучшений приведены ниже.

  • Тип datetime64 теперь не учитывает часовые пояса.

  • Добавлен параметр dtype в randint.

  • Улучшенное обнаружение возможного совместного использования памяти двумя массивами.

  • Автоматическая оценка размера бина для np.histogram.

  • Оптимизация скорости для A @ A.T и dot(A, A.T).

  • Новая функция np.moveaxis для переупорядочивания осей массива.

Изменения в системе сборки#

  • Numpy теперь использует setuptools для своих сборок вместо обычного distutils. Это исправляет использование install_requires='numpy' в setup.py файлы проектов, зависящих от Numpy (см. gh-6551). Это потенциально влияет на способ работы методов сборки/установки для самого Numpy. Пожалуйста, сообщайте о любом неожиданном поведении в трекере проблем Numpy.

  • Поддержка сборки Bento и связанные файлы были удалены.

  • Поддержка сборки из одного файла и связанные файлы были удалены.

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

Следующие изменения запланированы для Numpy 1.12.0.

  • Поддержка Python 2.6, 3.2 и 3.3 будет прекращена.

  • Проверка расслабленного шага станет стандартной. См. заметки о выпуске 1.8.0 для более подробного обсуждения последствий этого изменения.

  • Поведение значения datetime64 «не время» (NaT) будет изменено, чтобы соответствовать поведению значений с плавающей точкой «не число» (NaN): все сравнения с участием NaT будут возвращать False, кроме NaT != NaT, который будет возвращать True.

  • Индексирование с плавающей точкой вызовет IndexError, например, a[0, 0.0].

  • Индексирование с нецелочисленным массивоподобным объектом вызовет IndexError, например, a['1', '2']

  • Индексирование с несколькими многоточиями вызовет IndexError, например, a[..., ...].

  • Нецелые числа, используемые в качестве значений индекса, вызовут TypeError, например, в reshape, take, и указание оси сокращения.

В будущем релизе будут внесены следующие изменения.

  • The rand функция, представленная в numpy.testing будет удалена. Эта функция осталась от раннего Numpy и была реализована с использованием модуля Python random. Генераторы случайных чисел из numpy.random следует использовать вместо.

  • The ndarray.view метод будет разрешать просмотр только c_contiguous массивов с использованием типа данных другого размера, что приводит к изменению последнего измерения. Это отличается от текущего поведения, где массивы, которые являются f_contiguous, но не c_contiguous, могут быть просмотрены как тип данных другого размера, что приводит к изменению первого измерения.

  • Срез MaskedArray вернет представления обоих данных и маска. В настоящее время маска копируется при записи, и изменения маски в срезе не распространяются на исходную маску. Подробности см. в разделе FutureWarnings ниже.

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

изменения datetime64#

В предыдущих версиях NumPy экспериментальный тип datetime64 всегда хранил время в UTC. По умолчанию создание объекта datetime64 из строки или его вывод преобразовывали из или в местное время:

# old behavior
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00-0800')  # note the timezone offset -08:00

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

>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00')

Для обратной совместимости datetime64 всё ещё обрабатывает смещения часовых поясов, что он делает путём преобразования в UTC. Однако полученная дата и время не содержат информации о часовом поясе:

>>> np.datetime64('2000-01-01T00:00:00-08')
DeprecationWarning: parsing timezone aware datetimes is deprecated;
this will raise an error in the future
numpy.datetime64('2000-01-01T08:00:00')

Как следствие этого изменения, мы больше не запрещаем приведение между датами с единицами даты и датами с единицами времени. С датами без часового пояса правило приведения от дат к времени больше не является неоднозначным.

linalg.norm изменения типов возвращаемых значений#

Тип возвращаемого значения linalg.norm функция теперь всегда возвращает число с плавающей точкой без исключений. Некоторые типы норм ранее возвращали целые числа.

изменения полиномиальной аппроксимации#

Различные функции подгонки в пакете полиномов numpy больше не принимают нецелые числа для указания степени.

np.dot теперь вызывает TypeError вместо ValueError#

Такое поведение имитирует поведение других функций, таких как np.inner. Если два аргумента не могут быть приведены к общему типу, это могло вызвать TypeError или ValueError в зависимости от их порядка. Теперь, np.dot теперь всегда вызывает TypeError.

FutureWarning об изменении поведения#

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

% и // операторы#

Эти операторы реализованы с помощью remainder и floor_divide функции соответственно. Эти функции теперь основаны на fmod и вычисляются вместе, чтобы быть совместимыми друг с другом и с версиями Python для типов с плавающей точкой. Результаты должны быть немного более точными или исправлять ошибки по сравнению с предыдущими результатами, но они могут значительно отличаться в случаях, где округление влияет на целое число, возвращаемое floor_divide. Некоторые крайние случаи также изменяются, например, NaN всегда возвращается для обеих функций, когда делитель равен нулю, divmod(1.0, inf) возвращает (0.0, 1.0) кроме MSVC 2008, и divmod(-1.0, inf) возвращает (-1.0, inf).

C API#

Удалён check_return и inner_loop_selector члены PyUFuncObject struct (заменяя их на reserved слоты для сохранения структуры макета). Они никогда не использовались ни для чего, поэтому маловероятно, что какой-либо сторонний код использует их, но мы упоминаем это здесь для полноты.

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

В Python 2 объекты, являющиеся экземплярами устаревших пользовательских классов, больше не считаются автоматически типом 'object' в обработчике определения dtype. Вместо этого, как в Python 3, они могут считаться последовательностями, но только если они определяют оба __len__ и __getitem__ метод. Это исправляет ошибку сегментации и несогласованность между Python 2 и 3.

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

  • np.histogram теперь предоставляет плагин-оценщики для автоматической оценки оптимального количества бинов. Передача одного из ['auto', 'fd', 'scott', 'rice', 'sturges'] в качестве аргумента для 'bins' приводит к использованию соответствующего оценщика.

  • Набор тестов производительности с использованием Скорость воздушного потока был добавлен, заменяя предыдущий на основе vbench. Вы можете запустить набор локально через python runtests.py --bench. Для получения дополнительных подробностей см. benchmarks/README.rst.

  • Новая функция np.shares_memory которая может точно проверять, имеют ли два массива перекрытие памяти, добавлена. np.may_share_memory также теперь имеет опцию потратить больше усилий для уменьшения ложных срабатываний.

  • SkipTest и KnownFailureException классы исключений представлены в numpy.testing пространство имён. Вызовите их в тестовой функции, чтобы пометить тест как пропускаемый или как известный сбой соответственно.

  • f2py.compile имеет новый extension ключевой параметр, позволяющий указать расширение Fortran для генерируемых временных файлов. Например, файлы могут быть указаны как *.f90. verbose аргумент также активирован, ранее он игнорировался.

  • A dtype параметр был добавлен в np.random.randint Теперь можно генерировать случайные ndarrays следующих типов:

    • np.bool_,

    • np.int8, np.uint8,

    • np.int16, np.uint16,

    • np.int32, np.uint32,

    • np.int64, np.uint64,

    • np.int_, np.intp

    Спецификация задается точностью, а не типом C. Следовательно, на некоторых платформах np.int64 может быть long вместо long long даже если указанный dtype long long поскольку оба могут иметь одинаковую точность. Результирующий тип зависит от того, какой тип C использует numpy для заданной точности. Спецификация порядка байтов также игнорируется, сгенерированные массивы всегда имеют нативный порядок байтов.

  • Новый np.moveaxis функция позволяет перемещать одну или несколько осей массива в новую позицию, явно указывая исходные и целевые оси. Эта функция должна быть проще в использовании, чем текущая rollaxis функцию, а также предоставляя больше функциональности.

  • The deg параметр различных numpy.polynomial fits был расширен для принятия списка степеней членов, которые должны быть включены в подгонку, коэффициенты всех других членов ограничены нулём. Изменение обратно совместимо, передача скаляра deg будет вести себя как раньше.

  • Функция divmod для типов с плавающей точкой, смоделированная по версии Python, была добавлена в библиотеку npy_math.

Улучшения#

np.gradient теперь поддерживает axis аргумент#

The axis параметр был добавлен в np.gradient для согласованности. Это позволяет указать, по каким осям вычисляется градиент.

np.lexsort теперь поддерживает массивы с типом данных object#

Функция теперь внутренне вызывает обобщенную npy_amergesort когда тип не реализует сортировку слиянием. argsort метод.

np.ma.core.MaskedArray теперь поддерживает order аргумент#

При создании нового MaskedArray экземпляр, его можно настроить с помощью order аргумент, аналогичный тому, который используется при вызове np.ndarray. Добавление этого аргумента позволяет корректно обрабатывать order аргумент в нескольких служебных функциях, связанных с MaskedArray, таких как np.ma.core.array и np.ma.core.asarray.

Улучшения памяти и скорости для маскированных массивов#

Создание маскированного массива с mask=True (соответственно. mask=False) теперь использует np.ones (соответственно. np.zeros) для создания маски, что быстрее и позволяет избежать большого пика памяти. Другая оптимизация была выполнена для предотвращения пика памяти и бесполезных вычислений при выводе маскированного массива.

ndarray.tofile теперь использует fallocate на linux#

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

Оптимизации для операций вида A.T @ A и A @ A.T#

Ранее, gemm BLAS операции использовались для всех матричных произведений. Теперь, если матричное произведение между матрицей и её транспонированием, оно будет использовать syrk Операции BLAS для повышения производительности. Эта оптимизация была расширена на @, numpy.dot, numpy.inner, и numpy.matmul.

Примечание: Требует, чтобы транспонированная и нетранспонированная матрицы использовали общие данные.

np.testing.assert_warns теперь может использоваться как контекстный менеджер#

Это соответствует поведению assert_raises.

Ускорение для np.random.shuffle#

np.random.shuffle теперь значительно быстрее для одномерных ndarrays.

Изменения#

Поддержка Pyrex была удалена из numpy.distutils#

Метод build_src.generate_a_pyrex_source останется доступным; он был модифицирован пользователями для поддержки Cython вместо Pyrex. Рекомендуется переключиться на лучше поддерживаемый метод сборки расширений Cython.

np.broadcast теперь можно вызывать с одним аргументом#

Результирующий объект в этом случае будет просто имитировать итерацию по одному массиву. Это изменение делает устаревшими различия, такие как

if len(x) == 1:

shape = x[0].shape

иначе:

shape = np.broadcast(*x).shape

Вместо этого, np.broadcast может использоваться во всех случаях.

np.trace теперь учитывает подклассы массивов#

Такое поведение имитирует поведение других функций, таких как np.diagonal и гарантирует, например, что для массивов с маской np.trace(ma) и ma.trace() дают тот же результат.

np.dot теперь вызывает TypeError вместо ValueError#

Такое поведение имитирует поведение других функций, таких как np.inner. Если два аргумента не могут быть приведены к общему типу, это могло вызвать TypeError или ValueError в зависимости от их порядка. Теперь, np.dot теперь всегда вызывает TypeError.

linalg.norm изменения типов возвращаемых значений#

The linalg.norm функция теперь выполняет все вычисления с плавающей точкой и возвращает результаты с плавающей точкой. Это изменение исправляет ошибки из-за переполнения целых чисел и сбоя abs со знаковыми целыми минимального значения, например, int8(-128). Для согласованности используются числа с плавающей точкой даже там, где могло бы работать целое число.

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

Представления массивов в порядке Фортрана#

Флаг F_CONTIGUOUS использовался для обозначения того, что представления, использующие dtype, который изменяет размер элемента, будут изменять первый индекс. Это всегда было проблематично для массивов, которые были одновременно F_CONTIGUOUS и C_CONTIGUOUS, потому что C_CONTIGUOUS имел приоритет. Ослабленная проверка шагов приводит к большему количеству таких двойных непрерывных массивов и, как следствие, ломает некоторый существующий код. Обратите внимание, что это также влияет на изменение dtype путём присваивания атрибуту dtype массива. Цель этого устаревания — ограничить представления массивами C_CONTIGUOUS в будущем. Обратно совместимым решением является использование a.T.view(...).T вместо этого. Параметр также может быть добавлен к методу view для явного запроса представлений в порядке Фортрана, но это не будет обратно совместимым.

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

В настоящее время можно передавать аргументы для order параметр в методах, таких как array.flatten или array.ravel которые не были одним из следующих: 'C', 'F', 'A', 'K' (обратите внимание, что все эти возможные значения являются как юникодными, так и нечувствительными к регистру). Такое поведение не будет разрешено в будущих выпусках.

Генератор случайных чисел в testing пространство имён#

Генератор случайных чисел из стандартной библиотеки Python ранее был доступен в testing пространство имён как testing.rand. Использование этого генератора не рекомендуется, и он будет удален в будущем релизе. Используйте генераторы из numpy.random вместо пространства имен.

Генерация случайных целых чисел на закрытом интервале#

В соответствии с Python C API, который отдаёт предпочтение полуоткрытому интервалу перед закрытым, np.random.random_integers устаревает в пользу вызова np.random.randint, который был улучшен с помощью dtype параметр, как описано в разделе "Новые возможности". Однако, np.random.random_integers не будет удалён в ближайшее время.

FutureWarnings#

Присваивание срезам/представлениям MaskedArray#

В настоящее время срез маскированного массива содержит представление исходных данных и представление маски с копированием при записи. Следовательно, любые изменения маски среза приведут к созданию копии исходной маски, и изменения будут применены к этой новой копии, а не к оригиналу. Например, если мы создадим срез исходного массива следующим образом, view = original[:], тогда изменения данных в одном массиве повлияют на данные другого, но, поскольку маска будет скопирована во время операций присваивания, изменения маски останутся локальными. Аналогичная ситуация возникает при явном создании маскированного массива с помощью MaskedArray(data, mask), возвращаемый массив будет содержать представление data но маска будет представлением с копированием при записи mask.

В будущем эти случаи будут нормализованы, чтобы массивы данных и масок обрабатывались одинаково, и изменения в любом из них будут распространяться между представлениями. В версии 1.11 numpy будет выдавать MaskedArrayFutureWarning предупреждение всякий раз, когда пользовательский код изменяет маску представления, что в будущем может привести к распространению значений обратно в оригинал. Чтобы отключить эти предупреждения и сделать ваш код устойчивым к предстоящим изменениям, у вас есть два варианта: если вы хотите сохранить текущее поведение, вызовите masked_view.unshare_mask() перед изменением маски. Если вы хотите получить будущее поведение заранее, используйте masked_view._sharedmask = False. Однако обратите внимание, что установка _sharedmask атрибут сломается после явных вызовов masked_view.unshare_mask().