Умножение массива np.int8 с 127 дает разные типы массивов numpy в зависимости от платформы

Следующий код:

>>> import numpy as np
>>> np.arange(2).astype(np.int8) * 127

производит для numpy 1.13.3

# On Windows
array([0, 127], dtype=int16)
# On Linux
array([0, 127], dtype=int8)

Однако, если я изменяю 127 на a 126, оба возвращают массив np.int8. И если я изменю 127 на 128, верните массив np.int16.

Вопросы:

  • Это ожидаемое поведение?
  • Почему для этих двух платформ это отличается?

Ответы

Ответ 1

Это связано с проблемой NumPy 5917. A < вместо <= заставило np.can_cast(127, np.int8) быть False, поэтому NumPy использовал слишком большой dtype для 127. OS- потому что C longs имеют разный размер в Linux и Windows, а некоторые пути кода NumPy зависят от размера C long. Он исправлен в главной ветки, но еще не зафиксирован в любом выпуске.

Как только исправление будет выпущено, и вы обновите его до фиксированной версии, вы увидите dtype int8 на всех платформах.