将一个由1和0组成的numpy数组转换为十进制(Python)

3

大家好,希望你们都过得很好。

我正在处理一个小任务。我有一个二进制数字的字符串,需要将其转换为十进制数。我已经将字符串转换成了numpy数组,然后尝试了我在这个链接中看到的答案:

将二进制(0|1)numpy转换为整数或二进制字符串?

然而,由于我的数组大小为54,所以该解决方案并不正确,我得到的是负数结果,而正确的值是一个非常大的正数。

    # data_binary = [0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1]

data_decimal = data_binary.dot(1 << np.arange(data_binary.size)[::-1])

例如,这个实例中数据的二进制等效值为“8395915512384511”,但是我的脚本计算出来的是“1773014015”。 您有什么方法建议我使用来实现我的目标吗?非常感谢!
2个回答

2

我有些困惑,您说“decimal”,但我认为您的意思是整数而不是浮点数。无论如何,Python原生支持二进制数字:

x = 0b011101110101000000101001101001101011100000101111111111
print(x)

"0b"表示Python要显示的整数为二进制。如果您的二进制数字是一个字符串,则需要使用int()函数将其从字符串转换为整数:

x = int('011101110101000000101001101001101011100000101111111111',2)
print(x)

因为您正在使用“int32”,所以得到了1773014015,因此对条目进行手动算术运算将导致循环。如果您使用“int64”,则可以得到正确的答案。

import numpy as np

x = np.array([0,1,1,1,0,1,1,1,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,1,0,1,0,0,1,1,0,1,0,1,1,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1])
y = (x*2**np.arange(53,-1,-1,dtype='int64')).sum()
print(y)
y = x.dot(1 << np.arange(x.size,dtype='int64')[::-1])
print(y)

说句实话,我认为@kucar的意思是“十进制”,也就是“基数10”。 - LWKatze

1

既然已经给出了numpy的解决方案,这里提供一种Pythonic的方法。

sum([j*(2**i) for i,j in list(enumerate(reversed(c)))])
8395915512384511

c 是你的二进制数列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接