将numpy数组转换为纯python整数以避免整数

2024-03-29 09:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前问过这个问题,但遭到了强烈的反对。不管怎样,从没有人真的再次看到三重否决的问题这个事实来看,我重新发布它是为了表明我对实际答案感兴趣(如果有)。你知道吗

问题陈述:

我现在需要纯python整数的任意精度特性。在我的代码中,有一个带有布尔值的numpy数组。比如:

arr

array([ True, False, False, False, True, True, True, False, True, True, False, False, True, True, True, False, True, False, False, True, False, True, True, True, True, True, False, True, False, True, True, False, True, True, False, True, False, False, True, False, True, True, False, True, False, True, True, False, True, True, True, False, False, False, True, False, False, True, True, True, True, False, True, False])

我把它转换成numpy.int64,用arr.astype(int)来做算术运算。你知道吗

但是我用这段代码把它转换成一个溢出的整数(并且产生了我不想看到的负数)。你知道吗

代码正在使用此函数(它是纯python函数,本身不会有任何整数溢出问题):

def bool2int(x):
    y = 0
    for i,j in enumerate(x):
        y += j<<i
    return y

如果我直接在np.array上运行代码(转换为int与否无关紧要):

bool2int(arr)

-2393826705255337647

bool2int(h.astype(int))

-2393826705255337647

我需要一个正整数。所以,我用了一个列表:

bool2int([int(x) for x in arr])

16052917368454213969

显然,由arr表示的数字超过了固定精度整数(即263-1)能够直接使用ti的能力。你知道吗

有没有其他直接的方法来达到超越清单理解的目的?你知道吗

编辑:

对于python中的整数溢出理论,我引用了这个source。你知道吗


Tags: 函数代码innumpyfalsetruefor精度
2条回答

获取本机Python类型元素的一种方法是.tolist()。请注意,我们可以直接在布尔数组上执行此操作。您的代码可以很好地与本机Python bools配合使用。你知道吗

>>> x = np.random.randint(0, 2, (100,)).astype(bool)
>>> x
array([ True,  True, False,  True, False,  True, False, False,  True,
       False, False,  True,  True, False, False, False,  True, False,
       False,  True, False,  True, False, False,  True,  True,  True,
        True,  True,  True,  True, False, False, False, False, False,
        True,  True,  True,  True, False, False,  True, False, False,
       False, False,  True, False,  True,  True, False, False,  True,
       False,  True,  True,  True, False,  True,  True,  True, False,
        True,  True,  True,  True, False,  True,  True,  True, False,
        True, False,  True, False,  True, False,  True,  True,  True,
       False, False,  True,  True,  True,  True,  True, False, False,
        True, False, False, False,  True,  True,  True, False, False,  True], dtype=bool)
>>> bool2int(x)
-4925102932063228254
>>> bool2int(x.tolist())
774014555155191751582008547627L

作为额外的奖励,它实际上更快。你知道吗

>>> timeit(lambda:bool2int(x), number=1000)
0.24346303939819336
>>> timeit(lambda:bool2int(x.tolist()), number=1000)
0.010725975036621094

使用astype(int)似乎效果不错;以下代码:

import numpy as np

test = np.array([True, False, False, False, True, True, True, False, True, True, False, False, True, True, True, False, True, False, False, True, False, True, True, True, True, True, False, True, False, True, True, False, True, True, False, True, False, False, True, False, True, True, False, True, False, True, True, False, True, True, True, False, False, False, True, False, False, True, True, True, True, False, True, False])
test_int = test.astype(int)

print(test_int)
print(test_int.sum())

退货:

[1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 1 1 0
1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0]

37

您得到的溢出异常在这里似乎不太可能,因此我将再次研究它,因为您可能在其他地方有错误。你知道吗

编辑

如果要获取Python类型而不是numpy对象,只需执行以下操作:

test.astype(int).tolist()

相关问题 更多 >