Binary numpy array to list of integers?

前端 未结 5 1297
挽巷
挽巷 2020-11-27 07:08

I have a binary array, and I would like to convert it into a list of integers, where each int is a row of the array.

For example:

from numpy import *         


        
相关标签:
5条回答
  • 2020-11-27 07:45

    @SteveTjoa's answer is fine, but for kicks, here's a numpy one-liner:

    In [19]: a
    Out[19]: 
    array([[1, 1, 0, 0],
           [0, 1, 0, 0],
           [0, 1, 1, 1],
           [1, 1, 1, 1]])
    
    In [20]: a.dot(1 << arange(a.shape[-1] - 1, -1, -1))
    Out[20]: array([12,  4,  7, 15])
    

    (arange is numpy.arange.)

    If the bits are in the opposite order, change the order of the values produced by arange:

    In [25]: a.dot(1 << arange(a.shape[-1]))
    Out[25]: array([ 3,  2, 14, 15])
    
    0 讨论(0)
  • 2020-11-27 08:03

    You could also do this within numpy directly:

    from numpy import *
    a = array([[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 1], [1, 1, 1, 1]])
    
    b2i = 2**arange(a.shape[0]-1, -1, -1)
    
    result = (a*b2i).sum(axis=1)  #[12  4  7 15]
    
    0 讨论(0)
  • 2020-11-27 08:07

    If you like working directly with bitwise math, this one should work pretty well.

    def bits2int(a, axis=-1):
        return np.right_shift(np.packbits(a, axis=axis), 8 - a.shape[axis]).squeeze()
    
    bits2int(a)
    Out: array([12,  4,  7, 15], dtype=uint8)
    
    0 讨论(0)
  • 2020-11-27 08:10

    I once asked a similar question here. Here was my answer, adapted for your question:

    def bool2int(x):
        y = 0
        for i,j in enumerate(x):
            y += j<<i
        return y
    
    In [20]: a
    Out[20]: 
    array([[1, 1, 0, 0],
           [0, 1, 0, 0],
           [0, 1, 1, 1],
           [1, 1, 1, 1]])
    
    In [21]: [bool2int(x[::-1]) for x in a]
    Out[21]: [12, 4, 7, 15]
    
    0 讨论(0)
  • 2020-11-27 08:11

    Another one:

    def row_bits2int(arr):
        n = arr.shape[1]  # number of columns
    
        # shift the bits of the first column to the left by n - 1
        a = arr[:, 0] << n - 1  
    
        for j in range(1, n):
            # "overlay" with the shifted bits of the next column
            a |= arr[:, j] << n - 1 - j  
        return a
    
    0 讨论(0)
提交回复
热议问题