我有一个由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
如何将字符串转换为有符号整数?
答案 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
是上述数组。