我试图使用非常大的整数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
答案 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
object
,np.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函数(这通常是导致不同结果的原因)。