Python numpy.divmod和整数表示

时间:2017-09-21 10:14:08

标签: 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

1 个答案:

答案 0 :(得分:2)

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

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

object 10**i数组i > 19 objectnp.divmod数组为>>> np.divmod(np.array(10**5, dtype=object), 10) # smaller value but object array ((10000, 0), None) ,其他情况下为真正的NumPy数组"。

事实上,似乎None数组与object行为奇怪:

1) router.get('/getBusinessTypes.json', falcorServer.dataSourceRoute(function (req, res) {
2)    return new falcorRouter([
3)        {
4)            route: "businessTypes.all",
5)            get: function() {
6)                rp('http://localhost:8000/service?method=getBusinessTypes')
7)                    .then(function (res) {
8)                        console.log("Response from external Api: " + res);
9)                    })
10)                    .catch(function (err) {
11)                        console.log(err);
12)                    });
13)                return {path: ["businessTypes", "all"], value: $atom(res)};
14)            }
15)        }
16)    ]);
17) }));

我想在这种情况下,正常的 Python 内置divmod计算第一个返回的元素,所有剩余的项目都填充dictionary,因为它委托给Pythons函数。

请注意,ids = {'Id':['NYC','LA','UK'], 'City':['New York City','Los Angeles','United Kingdom']} ids = dict(zip(ids['Id'], ids['City'])) print (ids) {'UK': 'United Kingdom', 'LA': 'Los Angeles', 'NYC': 'New York City'} df['commentTest'] = df['Comment'].replace(ids, regex=True) print (df) Categories Comment Type \ 0 animal The NYC tree is very big tree 1 plant The cat from the UK is small dog 2 object The rock was found in LA. rock commentTest 0 The New York City tree is very big 1 The cat from the United Kingdom is small 2 The rock was found in Los Angeles. 数组的行为通常与本机dtype数组不同。它们慢得多,并且经常委托Python函数(这通常是导致不同结果的原因)。