2014-09-26 670 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]) 
相關問題