将 1 和 0 的 numpy 数组转换为十进制 (Python)
Converting a numpy Array of 1's and 0's to Decimal (Python)
你好,希望你们一切都好。
我现在正在做一个小作业。我有一个二进制数的字符串,我需要将其转换为十进制。我将字符串转换为一个 numpy 数组,然后尝试了我在 link 的答案中看到的内容:
但是,由于我的数组大小为 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])
例如,在本例中 data_binary 的十进制等效值为“8395915512384511”,但我的脚本将其计算为“1773014015”。
有什么方法可以建议我用来实现我的目标吗?提前致谢!
我很困惑,你说的是“十进制”,但我认为你指的是整数而不是浮点数。无论如何,python 原生支持用二进制编写的数字:
x = 0b011101110101000000101001101001101011100000101111111111
print(x)
“0b”告诉 python 以下整数以二进制显示。如果你的二进制数是一个字符串,那么你需要使用int()函数来将字符串转换为int:
x = int('011101110101000000101001101001101011100000101111111111',2)
print(x)
您得到 1773014015 因为您使用的是“int32”,因此对条目进行手动算术将导致循环。如果您使用“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)
因为已经给出了 numpy
解决方案。这是一个 pythonic 的方法。
sum([j*(2**i) for i,j in list(enumerate(reversed(c)))])
8395915512384511
c
是二进制数列表所在的位置。
你好,希望你们一切都好。
我现在正在做一个小作业。我有一个二进制数的字符串,我需要将其转换为十进制。我将字符串转换为一个 numpy 数组,然后尝试了我在 link 的答案中看到的内容:
但是,由于我的数组大小为 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])
例如,在本例中 data_binary 的十进制等效值为“8395915512384511”,但我的脚本将其计算为“1773014015”。
有什么方法可以建议我用来实现我的目标吗?提前致谢!
我很困惑,你说的是“十进制”,但我认为你指的是整数而不是浮点数。无论如何,python 原生支持用二进制编写的数字:
x = 0b011101110101000000101001101001101011100000101111111111
print(x)
“0b”告诉 python 以下整数以二进制显示。如果你的二进制数是一个字符串,那么你需要使用int()函数来将字符串转换为int:
x = int('011101110101000000101001101001101011100000101111111111',2)
print(x)
您得到 1773014015 因为您使用的是“int32”,因此对条目进行手动算术将导致循环。如果您使用“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)
因为已经给出了 numpy
解决方案。这是一个 pythonic 的方法。
sum([j*(2**i) for i,j in list(enumerate(reversed(c)))])
8395915512384511
c
是二进制数列表所在的位置。