Python numpy.divmod 和整数表示

标签 python numpy internal-representation divmod

我试图使用 numpy.divmod对于非常大的整数,我注意到一个奇怪的行为。大约2**63 ~ 1e19 (这应该是 python 3.5+ 中 int 的通常内存表示的限制),会发生这种情况:

from numpy import divmod

test = 10**6
for i in range(15,25):
  x = 10**i
  print(i, divmod(x, test))

15 (1000000000, 0)
16 (10000000000, 0)
17 (100000000000, 0)
18 (1000000000000, 0)
19 (10000000000000.0, 0.0)
20 ((100000000000000, 0), None)
21 ((1000000000000000, 0), None)
22 ((10000000000000000, 0), None)
23 ((100000000000000000, 0), None)
24 ((1000000000000000000, 0), None)

不知怎的,商和余数一直工作得很好,直到 2**63 ,那么就有不同的东西了。

我的猜测是 int表示是“矢量化的”(即 Scala 中的 BigInt ,作为 Seq 的小端 Long )。但是,我预计,由于 divmod(array, test) ,一对数组:商数组和余数数组。

我对这个功能一无所知。内置 divmod 不会发生这种情况(一切按预期工作)

为什么会发生这种情况?和int有关系吗?内部代表?

详细信息:numpy版本1.13.1,python 3.6

最佳答案

问题是 np.divmod 会将参数转换为数组,并且发生的事情非常简单:

>>> np.array(10**19)
array(10000000000000000000, dtype=uint64)
>>> np.array(10**20)
array(100000000000000000000, dtype=object)

您将获得 10**ii > 19object 数组,在其他情况下,它将是“真实的” NumPy 数组”。

事实上,object 数组与 np.divmod 的行为似乎很奇怪:

>>> np.divmod(np.array(10**5, dtype=object), 10)   # smaller value but object array
((10000, 0), None)

我猜在这种情况下是正常的Python内置divmod计算第一个返回的元素,所有剩余项都用 None 填充,因为它委托(delegate)给了 Python 函数。

请注意,object 数组的行为通常与 native dtype 数组不同。它们速度慢得多,并且经常委托(delegate)给 Python 函数(这通常是不同结果的原因)。

关于Python numpy.divmod 和整数表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46341243/

相关文章:

python - 如何在 python 代码中找到 txt 文件中的每个 'x'?

python - lxml解析器吃掉所有内存

python - sklearn feature.Extraction 'DictVectorizer' 对象没有属性 'feature_names_'

sql - sql server中日期时间的内部表示是什么?

python - 图像未转换为灰度

python - "Got KeyError when attempting to get a value for field ` 用户名 ` on serializer ` UserCreateSerializer`

python - 在python中循环遍历真值数组并用另一个数组中的组件替换真值

python - 如何更改满足特定条件的数据框中的第一个值

r - R 在内部如何表示 NA?