2014-09-26 4 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]]) 

첫 번째 열은 숫자의 부호입니다.

예 : I가

INT 사용
1, 0, 1, 1, 1, 0, 1, 1 -> 1 0111011 -> -59 

(STR,베이스 = 2) I (187) 값을 획득하고, 값이 -59이어야 결과.

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

어떻게 문자열을 부호있는 정수로 변환 할 수 있습니까?

답변

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 
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 

그건 : arr은 상기 배열입니다

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) 

.

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]) 
관련 문제