【问题标题】:Convert a binary string into signed integer - Python将二进制字符串转换为有符号整数 - Python
【发布时间】:2014-09-26 13:31:57
【问题描述】:

我有一个由 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

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

【问题讨论】:

    标签: python numpy integer type-conversion


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以将每一行拆分为符号和值变量。然后如果符号为负,则将值乘以 -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
      

      【讨论】:

        【解决方案3】:

        首先,它看起来像 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是上述数组。

        【讨论】:

          猜你喜欢
          • 2019-05-03
          • 2015-05-02
          • 2020-11-26
          • 1970-01-01
          • 2012-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多