Любопытный оператор модуля (%) Результат - PullRequest
0 голосов
/ 25 мая 2018

Что здесь происходит?

>>> 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).С другой стороны, крайне редко когда-либо модифицировать что-либо с помощью отрицательного числа (я никогда не делал этого, кроме как посмотреть, что произойдет), потому что вы обычно модифицируете вещи, которые вы можете посчитать, такие как индексы и разные языки / стандарты / библиотекикаждый может иметь свое собственное представление о том, каким должен быть результат.

Все это вместе приводит меня в замешательство.

1 Ответ

0 голосов
/ 25 мая 2018

Мы неожиданно получаем то, что выглядит как строка, содержащая число с плавающей запятой 1.0!?

Это все еще float64 - это выглядит странно из-за ошибки в numpy 1.14.3 , который исправлен в 1.15.0-dev.

Обычно вы предполагаете, что есть только два способа преобразования в строку - __repr__ (tp_repr) и __str__ (tp_str).

Оказывается, что в Python 2 есть еще один - tp_print.Это вызывается только при выводе непосредственно на консоль или интерпретатор.

Оказывается, мы неправильно реализовали это только для интерпретатора.Тестировать поведение интерпретатора в наборе тестов довольно сложно!

, хотя оказывается, что это просто число с плавающей точкой.

Это что-то вроде конструкции - 2предполагается, что np.int64(2), и принуждение {int64, uint64} -> float64 (чтобы не вызывать усечение).Есть множество проблем по этому поводу, но это сложно исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...