2014-10-31 3 views
4

Я хочу вычесть 2 серыми человеческими лицами друг от друга, чтобы увидеть разницу, но я столкнулся с проблемой, которая вычитает, например, [4] - [6] дает [254] вместо [-2] (или разность: [2]).Вычитание пинтовских чисел без отрицательных чисел (4-6 дает 254)

print(type(face)) #<type 'numpy.ndarray'> 
print(face.shape) #(270, 270) 
print(type(nface)) #<type 'numpy.ndarray'> 
print(nface.shape) #(270, 270) 

#This is what I want to do: 
sface = face - self.nface #or 
sface = np.subtract(face, self.nface) 

Оба не дают отрицательные числа, но вместо того, чтобы вычесть остаток после 0 из 255.

Выходной пример sface:

[[ 8 255 8 ..., 0 252 3] 
[ 24 18 14 ..., 255 254 254] 
[ 12 12 12 ..., 0 2 254] 
..., 
[245 245 251 ..., 160 163 176] 
[249 249 252 ..., 157 163 172] 
[253 251 247 ..., 155 159 173]] 

Мой вопрос: Как получить sface - numpy.ndarray (270,270) с отрицательными значениями после вычитания или разницы между каждой точкой лица и nface? (Так что не numpy.setdiff1d, потому что это возвращает только один размер вместо 270x270)

Рабочая

Из ответа @ajcr я сделал следующее (абс() для показа вычтена лицо):

face_16 = face.astype(np.int16) 
nface_16 = nface.astype(np.int16) 
sface_16 = np.subtract(face_16, nface_16) 
sface_16 = abs(sface_16) 
sface = sface_16.astype(np.int8) 
+0

Невозможно реплицировать, если я создаю два массива numpy, заполненных значениями в диапазоне 0-255. Я могу просто выполнить 'a - b', и это даст мне отрицательные числа. – Ffisegydd

+2

Ваш массив должен быть целым числом без знака - попробуйте, например. 'DTYPE = np.int16'. – jonrsharpe

ответ

6

Похоже, что dtype из массива uint8. Все числа будут интерпретироваться как целые числа в диапазоне 0-255. Здесь -2 равно 256 - 2, поэтому вычитание приводит к 254.

Вам необходимо переделать массивы в dtype, который поддерживает отрицательные целые числа, например. int16 как это ...

face = face.astype(np.int16) 

... а потом вычитать.

+0

Теперь я использовал следующий код (abs() для отображения лица): Ok nvm, код здесь не работает, см. Мой пост – NumesSanguis

2

Это проблема с вашим типом данных в массиве numpy. У вас есть uint8 внутри, который, кажется, обертывается вокруг

Посмотрите на nfac.dtype, который покажет его вам. Вы должны преобразовать его перед вашей расчетной операцией. Используйте numpy.ndarray.astype, чтобы преобразовать его или посмотреть на In-place type conversion of a NumPy array

Смежные вопросы