Я подозреваю, что это связано с тем, что python может хранить произвольно длинные целые числа, и numpy понимает, что он не может безопасно привести результат к известному типу данных.Следовательно, он возвращается к обработке массива как массива объектов Python и поэлементно умножается с использованием правил Python (которые приводятся к числу с плавающей запятой).
Вы можете увидеть, что представляет собой тип результата, используя np.result_type
:
>>> np.result_type(np.array([10.0, 56.0],long(10**47))
dtype('O')
На основании документации для np.result_type
происходит:
Сначала np.min_scalar_type()
вызывается на каждом из входов:
>>> np.min_scalar_type(np.array([10.0, 56.0]))
dtype('float64')
>>> np.min_scalar_type(long(10**47))
dtype('O')
Во-вторых, результат определяется путем объединения этих типов с использованием np.promote_types:
>>> np.promote_types(np.float64,np.dtype('O'))
dtype('O')