Ошибка повышения при установке значений, выходящих за пределы диапазона

#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, поскольку он применяет строгие типы. Но это, вероятно, тоже излишне