Кастинг и раскрутка шрифтов в numpy довольно сложны и иногда удивляют. Эта недавняя неофициальная статья Себастьяна Берга объясняет некоторые нюансы предмета (в основном концентрирующиеся на скалярах и 0d-массивах).
Цитата из этого документа:
Целые числа Python и числа с плавающей запятой
Обратите внимание, что целые числа Python обрабатываются точно так же, как и числовые. Они, однако, особенные в том, что у них нет dtype, ассоциированного с ними явно. Логика, основанная на значениях, как описано здесь, кажется полезной для целых чисел и чисел с плавающей точкой, чтобы разрешить:
arr = np.arange(10, dtype=np.int8)
arr += 1
# or:
res = arr + 1
res.dtype == np.int8
, которая гарантирует, что не произойдет повышения (например, с более высоким использованием памяти).
(выделение мое.)
См. Также Суть Аллана Холдейна, предполагающая принуждение в стиле C , ссылка на которую приведена в предыдущем документе:
В настоящее время, когда в двоичной операции участвуют два dtypes, принцип numpy заключается в том, что «диапазон выходного dtype охватывает диапазон обоих входных dtypes», , а когда задействован один dtype, никогда не происходит приведение.
(снова акцент мой.)
Так что я понимаю, что правила продвижения для бесчисленных скаляров и массивов различаются, в первую очередь потому, что невозможно проверить каждый элемент в массиве, чтобы определить,литье можно сделать безопасно. Снова из предыдущего документа:
Правила на основе скаляров
В отличие от массивов, где проверка всех значений невозможна, для скаляров (и 0-D массивов) проверяется значение.
Это будет означать, что вы можете использовать np.int64
с самого начала, чтобы быть безопасным (и если вы используете Linux, dtype=int
фактически сделает это самостоятельно), или проверитьМаксимальное значение ваших массивов до подозрительных операций и определить, нужно ли вам продвигать dtype самостоятельно, в каждом конкретном случае. Я понимаю, что это может быть неосуществимо, если вы делаете много расчетов, но я не верю, что есть способ обойти это, учитывая текущие правила продвижения типа numpy.