这个问题已经有答案了:
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
。我在哪里可以读到这种行为?
1条答案
按热度按时间zour9fqk1#
Numpy首先尝试将python对象转换为它的内置类型。
10**20
是大于64位的整数。numpy中的内置整数类型都没有这个范围。因此,numpy将其保持为int
对象,并带有dtype='object'
。在这一点上,numpy不使用任何内置类型或数学。当你写
array(..., dtype='object') * array(...)
或类似的东西时,它只是调用第一个数组中对象的__mul__
运算符。这就解释了最终的结果。
10**20
仍然是pythonint
对象。然后numpy为ones
数组中的每个条目调用10**20 * np.float64(1)
。结果是一个pythonfloat
对象。它被存储在一个新的dtype='object'
数组中。numpy.result_type
中简要解释了类型转换规则