2014-02-06 1 views
2

Я использую python 2.7, numpy 1.6.1, 32-bit на окнах. Я пишу функцию, чтобы упаковать некоторые данные в 32-битные целые числа и генерировать исходные объявления C из постоянных значений. При этом я обнаружил странное поведение в типе uint8 numpy.Почему смещение numpy uint8 создает отрицательные значения?

Никто не удивляется, я уверен, чтобы увидеть это:

>>> n = 0x94 << 24 
>>> n 
2483027968L 
>>> hex(n) 
'0x94000000L' 

Но сделать то же самое с Numpy uint8, и вы получите то, что меня удивило:

>>> n = np.uint8(0x94) << 24 
>>> n 
-1811939328 
>>> hex(n) 
'-0x6c000000' 

One будет думать, что явно неподписанный тип будет еще реже возвращать отрицательное значение.

Обратите внимание, что значения со знаком-битном четкой работы, как и ожидалось:

>>> n = np.uint8(0x74) << 24 
>>> n; hex(n) 
1946157056 
'0x74000000' 

я случайно заметил, что NumPy, кажется, поощрения неподписанных типов для подписанных типов:

>>> n = np.uint8(0x74) << 24 
>>> type(n) 
<type 'numpy.int32'> 

Это кажется ясная ошибка. Я не могу найти ссылку на такую ​​известную ошибку, но ... не так ли?

ответ

2

numpy появляется для лечения правого аргумента (24) как целое число родной ширины (int32 в вашем случае, int64 в шахте).

Похоже uint8 продвинут к тому же типу, и результат сдвига также одного и того же типа:

>>> np.uint8(0x94) << 56 
-7782220156096217088 
>>> type(np.uint8(0x94) << 56) 
<type 'numpy.int64'> 

Making правый аргумент в беззнаковое int дает результат, который вы ожидается:

>>> np.uint8(0x94) << np.uint(56) 
10664523917613334528 
>>> type(np.uint8(0x94) << np.uint(56)) 
<type 'numpy.uint64'> 
>>> hex(np.uint8(0x94) << np.uint(56)) 
'0x9400000000000000L' 
Смежные вопросы