Spec-Zone.ru › NumPy 2.0

Проверка ошибок и исправлений ошибок в NumPy

В этом руководстве вы узнаете, как:

  • Проверить наличие ошибки в NumPy
  • Проверить исправление, если таковое имеется, для ошибки

Во время выполнения процесса проверки вы узнаете, как:

  • Настроить виртуальную среду Python (используя virtualenv)
  • Установить соответствующие версии NumPy, сначала, чтобы увидеть ошибку в действии, а затем, чтобы проверить её исправление

Задача 16354 используется в качестве примера.

Эта проблема была:

Заголовок: Тип возвращаемого значения np.polymul — np.float64 или np.complex128 при задании аргумента, состоящего только из нулей

np.polymul возвращает объект с типом np.float64, когда один аргумент состоит только из нулей, а оба аргумента имеют тип np.int64 или np.float32. Аналогичное происходит с нулевым np.complex64, дающим результат типа np.complex128.

Это не происходит с ненулевыми аргументами; там результат соответствует ожиданиям.

Эта ошибка отсутствует в np.convolve.

Пример воспроизводящего кода:

>>> import numpy as np
>>> np.__version__
'1.18.4'
>>> a = np.array([1,2,3])
>>> z = np.array([0,0,0])
>>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype
dtype('int64')
>>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype
dtype('float64')
>>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype
dtype('float64')
>>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype
dtype('complex128')
Numpy/Python version information:
>>> import sys, numpy; print(numpy.__version__, sys.version)
1.18.4 3.7.5 (default, Nov  7 2019, 10:50:52) [GCC 8.3.0]

1. Настройка виртуальной среды

Создайте новую директорию, войдите в неё и настройте виртуальную среду с помощью вашего предпочтительного метода. Например, вот как это сделать, используя virtualenv в Linux или macOS:

virtualenv venv_np_bug
source venv_np_bug/bin/activate

Это гарантирует, что система/глобальная/по умолчанию установка Python/NumPy не будет изменена.

2. Установка версии NumPy, в которой была обнаружена ошибка

В отчёте указана версия NumPy 1.18.4, поэтому в этом случае вам нужно установить именно эту версию.

Поскольку эта ошибка связана с выпуском, а не со специфическим коммитом, будет достаточно установить предварительно собранный wheel в вашей виртуальной среде через pip:

pip install numpy==1.18.4

Некоторые ошибки могут потребовать от вас построения версии NumPy, указанной в отчёте об ошибке. Чтобы узнать, как это сделать, посетите Сборка из исходного кода.

3. Воссоздание ошибки

Ошибка, описанная в #16354, заключается в том, что неправильный dtype возвращается, если один из входных данных метода numpy.polymul является нулевым массивом.

Для воспроизведения ошибки запустите терминал Python, введите фрагмент кода, показанный в отчёте об ошибке, и убедитесь, что результаты совпадают с теми, что указаны в задаче:

>>> import numpy as np
>>> np.__version__
'...' # 1.18.4
>>> a = np.array([1,2,3])
>>> z = np.array([0,0,0])
>>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype
dtype('int64')
>>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype
dtype('...') # float64
>>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype
dtype('...') # float64
>>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype
dtype('...') # complex128

Как указано, всякий раз, когда нулевой массив, z в примере выше, является одним из аргументов для numpy.polymul, возвращается неправильный dtype

4. Проверка исправлений в последней версии NumPy

Если отчёт об ошибке для вашей проблемы ещё не решен, необходимо выполнить дополнительные действия или отправить исправления.

Однако в данном случае проблема была решена в PR 17577 и теперь закрыта. Так что вы можете попытаться проверить исправление.

Для проверки исправления:

  1. Удалите версию NumPy, в которой ошибка всё ещё существует:

    pip uninstall numpy
    
  2. Установите последнюю версию NumPy:

    pip install numpy
    
  3. В вашем терминале Python запустите представленный фрагмент кода, который вы использовали для проверки существования ошибки, и подтвердите, что проблема решена:

    >>> import numpy as np
    >>> np.__version__
    '...' # 1.18.4
    >>> a = np.array([1,2,3])
    >>> z = np.array([0,0,0])
    >>> np.polymul(a.astype(np.int64), a.astype(np.int64)).dtype
    dtype('int64')
    >>> np.polymul(a.astype(np.int64), z.astype(np.int64)).dtype
    dtype('int64')
    >>> np.polymul(a.astype(np.float32), z.astype(np.float32)).dtype
    dtype('float32')
    >>> np.polymul(a.astype(np.complex64), z.astype(np.complex64)).dtype
    dtype('complex64')
    

Обратите внимание, что теперь возвращается правильный dtype, даже если нулевой массив является одним из аргументов numpy.polymul.

5. Поддержка развития NumPy путём проверки и исправления ошибок

Перейдите на страницу GitHub-проблем NumPy и посмотрите, можете ли вы подтвердить наличие других ошибок, которые ещё не были подтверждены. В частности, для разработчиков полезно знать, можно ли воспроизвести ошибку в более новой версии NumPy.

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

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/user/how-to-verify-bug.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API