Что здесь происходит?
>>> a = np.int8(1)
>>> a%2
1
>>> a = np.uint8(1)
>>> a%2
1
>>> a = np.int32(1)
>>> a%2
1
>>> a = np.uint32(1)
>>> a%2
1
>>> a = np.int64(1)
>>> a%2
1
>>> a = np.uint64(1)
>>> a%2
'1.0'
Мы неожиданно получаем то, что выглядит как строка , содержащая float 1.0
!?
>>> a = np.uint64(1)
>>> type(a%2)
<type 'numpy.float64'>
... хотя оказывается, что это просто поплавок.
Какая философия стоит за этим?
Я понимаю, что numpy хочет быть более строгим в таких вещах, как типы и правила вводадля того, чтобы быть более эффективным, чем базовый питон, но в этом случае недостатки возврата очень неожиданного результата пользователю (вероятно, нарушают его программу), кажется, намного перевешивают небольшое увеличение стоимости просто проверки знака модуля перед блужданиемпо этому скользкому пути.
Нередко можно работать со значениями uint64
.Например, если вы когда-либо загружаете изображение в массив numpy int и затем суммируете его, у вас есть uint64
(s).С другой стороны, крайне редко когда-либо модифицировать что-либо с помощью отрицательного числа (я никогда не делал этого, кроме как посмотреть, что произойдет), потому что вы обычно модифицируете вещи, которые вы можете посчитать, такие как индексы и разные языки / стандарты / библиотекикаждый может иметь свое собственное представление о том, каким должен быть результат.
Все это вместе приводит меня в замешательство.