将二进制字符串转换为有符号整数 - Python

时间:2014-09-26 13:31:57

标签: python numpy integer type-conversion

我有一个由NumPy创建的二进制矩阵。矩阵有6行8列。

array([[1, 0, 1, 1, 1, 0, 1, 1],
       [1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 0, 0, 1, 1, 1],
       [1, 0, 1, 1, 0, 1, 1, 0],
       [0, 1, 0, 0, 1, 0, 1, 1],
       [0, 1, 0, 1, 1, 1, 0, 0]])

第一列是数字的符号。

例如:

1, 0, 1, 1, 1, 0, 1, 1 -> 1 0111011 -> -59

当我使用 int(str,base = 2)作为结果时,我收到值187,值应为-59。

>>> int(''.join(map(str, array[0])), 2)
>>> 187

如何将字符串转换为有符号整数?

3 个答案:

答案 0 :(得分:2)

Pyhton不知道第一位应该代表符号(与bin(-59)比较),所以你必须自己处理,例如,如果A包含数组:< / p>

num = int(''.join(map(str, A[0,1:])), 2)
if A[0,0]:
    num *= -1

这是一个更多的Numpy-ish方法,一次完成整个阵列:

num = np.packbits(A).astype(np.int8)
num[num<0] = -128 - num[num<0]

最后,代码 - 高尔夫版:

(A[:,:0:-1]<<range(7)).sum(1)*(1-2*A[:,0])

答案 1 :(得分:0)

您可以将每一行分为符号和值变量。然后,如果sign为负,则将该值乘以-1。

row = array[0]
sign, value = row[0], row[1:]
int(''.join(map(str, value)), 2) if sign == 0 else int(''.join(map(str, value)), 2) * -1

答案 2 :(得分:0)

首先,它看起来像NumPy数组而不是NumPy矩阵。 我能想到几个选项。非常直接的方式将是这样的:

def rowToSignedDec(arr, row):
    res = int(''.join(str(x) for x in arr[row][1:].tolist()),2)

    if arr[row][0] == 1:
        return -res

    else:
        return res

print rowToSignedDec(arr, 0)

-59

那个显然不是最有效的一个,也不是最短的一个:

int(''.join(str(x) for x in arr[0][1:].tolist()),2) - 2*int(arr[0][0])*int(''.join(str(x) for x in arr[0][1:].tolist()),2)

arr是上述数组。