Примечания к выпуску 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,)независимо от размерности массива, который разделяется. Это было изменено так, чтобы размерности сохранялись. AFutureWarningдля этого изменения действует с 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даже если указанный dtypelong longпоскольку оба могут иметь одинаковую точность. Результирующий тип зависит от того, какой тип C использует numpy для заданной точности. Спецификация порядка байтов также игнорируется, сгенерированные массивы всегда имеют нативный порядок байтов.Новый
np.moveaxisфункция позволяет перемещать одну или несколько осей массива в новую позицию, явно указывая исходные и целевые оси. Эта функция должна быть проще в использовании, чем текущаяrollaxisфункцию, а также предоставляя больше функциональности.The
degпараметр различныхnumpy.polynomialfits был расширен для принятия списка степеней членов, которые должны быть включены в подгонку, коэффициенты всех других членов ограничены нулём. Изменение обратно совместимо, передача скаляра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().