Как изменить значение в массиве на отрицательное

Я преобразовал изображение в массив, и я хочу изменить эти значения на биполярные (1,-1) следующим образом:

im = Image.open("letter_d.png").convert("L")
ar = np.array(im)
ar[ar == 0] = 1
ar[ar == 255] = -1

Я получаю что-то вроде этого:

[[255   1   1   1 255 255 255]
[  1   1   1   1   1 255 255]
[  1   1 255 255   1   1 255]
[  1   1 255 255 255   1   1]
[  1   1 255 255 255   1   1]
[  1   1 255 255 255   1   1]
[  1   1 255 255   1   1   1]
[  1   1   1   1   1   1 255]
[255 255 255 255 255 255 255]]

Проблема в том, что значения 255 остаются неизменными, я заметил, что если вместо этого я попытаюсь изменить их на положительное значение, такое как 2, то оно продолжится.

2 ответа

Решение

Похоже, у вас есть массив dtype uint8:

>>> ar = np.array([0, 255], dtype=np.uint8)
>>> ar
array([  0, 255], dtype=uint8)
>>> ar[1] = -1
>>> ar
array([  0, 255], dtype=uint8)
>>> ar[1] = -2
>>> ar
array([  0, 254], dtype=uint8)

Если это так, вы не можете иметь отрицательные значения (u в uint8 означает "без знака"). При попытке установить отрицательное значение -1, он "оборачивается" до максимального значения (комплимент 2).

Вам нужно будет конвертировать в другой (подписанный) тип.

>>> signed_array = np.array(ar, dtype=int)
>>> signed_array
array([  0, 254])
>>> signed_array[1] = -1
>>> signed_array
array([ 0, -1])

Тип, который вы выбираете, вероятно, зависит от того, в каком диапазоне значений вы собираетесь собираться, но int/np.int32 должен быть довольно безопасным для большинства приложений...

Преобразование массива в np.int8 с ar.astype(np.int8) автоматически преобразует 255с -1s

Другие вопросы по тегам