Проверка ошибок и исправлений ошибок в 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 и теперь закрыта. Так что вы можете попытаться проверить исправление.
Для проверки исправления:
-
Удалите версию NumPy, в которой ошибка всё ещё существует:
pip uninstall numpy
-
Установите последнюю версию NumPy:
pip install numpy
-
В вашем терминале 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