#python #numpy #types #integer-overflow #array-broadcasting
#питон #тупой #типы #целое число-переполнение #массив-вещание
Вопрос:
Как можно разрешить проверку значений вне диапазона в numpy, если, например, установить uint8
элемент матрицы равным -1
? Текущее поведение просто принимает его молча, устанавливая для элемента значение 255
. Есть ли способ разрешить возникновение ошибки во время отладки, или это может быть достигнуто только путем создания подклассов массивов numpy? Это довольно частое явление, которое трудно заметить и исправить, особенно при выполнении нескольких операций.
Пример:
import numpy as np
img = np.zeros((5, 5), dtype=np.uint8)
img[:] = -1
img
и вывод:
array([[255, 255, 255, 255, 255],
[255, 255, 255, 255, 255],
[255, 255, 255, 255, 255],
[255, 255, 255, 255, 255],
[255, 255, 255, 255, 255]], dtype=uint8)
Ответ №1:
Я думаю, предварительная проверка вручную не вариант, потому что вы хотите полагаться на высокую скорость numpy?
Комментарии:
1. Спасибо за ваш вклад. Вы правы. Однако существуют и другие операции, которые могут вызывать исключения с плавающей запятой, и они принимаются во внимание, причем их уровень ошибок обрабатывается
numpy.seterr
методом.2. вы пробовали использовать NaN вместо -1? Но это действительно было бы решением только этой конкретной проблемы
3. Единственный способ избежать недопустимых значений во время маскировки — это использовать
numpa.ma
модуль, но это излишество, оно снижает производительность и не может использоваться глобально. Именно по этой причине я не нахожу причин, объясняющих отсутствие такого флага отладки.4. одним из способов на самом деле избежать этого было бы использование cython, поскольку он применяет строгие типы. Но это, вероятно, тоже излишне