2014-09-26 669 views
0

我有一个由NumPy创建的二进制矩阵。矩阵有6行8列。将二进制字符串转换为有符号整数 - Python

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,基础= 2)作为我接收到的值187,该值应为-59的结果。

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

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

回答

0

您可以将每行分隔符号和值变量。然后如果符号是负值,则将值乘以-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 
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是上述阵列。

2

Pyhton不知道,第一位应该代表符号(有bin(-59)比较),所以你必须处理一下,比如,如果A包含数组:

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

这里的更NumPy的十岁上下的方式做到这一点,对整个阵列一次:

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]) 
相关问题