整数浮点数产品中的Numpy促销[重复]

xurqigkl  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(123)

这个问题已经有答案了

Why does the dtype of a numpy array automatically change to 'object' if you multiply the array with a number equal to or larger than 10**20?(1个答案)
26天前关闭
今天在分析一些代码时,我对以下行为感到惊讶:

import numpy as np
print(repr(10**19 * np.ones(1, dtype=np.float64)))
print(repr(10**20 * np.ones(1, dtype=np.float64)))

返回:

array([1.e+19])
array([1e+20], dtype=object)

后一种产品是“提升”的,因此dtype=object。我觉得这有点令人惊讶,因为type(10**20 * 1.0)在纯Python中是float。我在哪里可以读到这种行为?

zour9fqk

zour9fqk1#

Numpy首先尝试将python对象转换为它的内置类型。
10**20是大于64位的整数。numpy中的内置整数类型都没有这个范围。因此,numpy将其保持为int对象,并带有dtype='object'

type(np.array([10**20])[0])
<class 'int'>
ype(np.array([10**19])[0])
<class 'numpy.ulonglong'>
type(np.array([10**18])[0])
<class 'numpy.int64'>
type(np.array([10])[0])
<class 'numpy.int64'>

在这一点上,numpy不使用任何内置类型或数学。当你写array(..., dtype='object') * array(...)或类似的东西时,它只是调用第一个数组中对象的__mul__运算符。
这就解释了最终的结果。10**20仍然是python int对象。然后numpy为ones数组中的每个条目调用10**20 * np.float64(1)。结果是一个python float对象。它被存储在一个新的dtype='object'数组中。
numpy.result_type中简要解释了类型转换规则

相关问题