Binary numpy array to list of integers?

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 *
a = array([[1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 1], [1, 1, 1, 1]])

I would like to convert a to [12, 4, 7, 15].

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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

Method 2

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]

Method 3

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]

Method 4

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)

Method 5

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x