13

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

asked Mar 19, 2013 at 16:46
0

5 Answers 5

36

@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])
answered Mar 19, 2013 at 17:09
Sign up to request clarification or add additional context in comments.

2 Comments

what if the size of the array is very large? (like greater than 64). In that case '1 << arange(a.shape[-1] - 1, -1, -1)' returns negative values. So can we work around that?
In that case, the integers exceed the limits that can be represented with the standard numpy data types. How to handle that depends on how the result will be used. These comments aren't the place to discuss that. If you have such a need, and need help with your implementation, you could ask a new question. If you do, be sure to explain why it is not a duplicate of this question.
8

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]
answered Mar 19, 2013 at 16:52

1 Comment

This is perfect! I only searched for questions about binary, not booleans, so I didn't see your earlier question. Thanks for your help.
2

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]
answered Mar 19, 2013 at 17:07

Comments

2

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)
answered Jul 27, 2017 at 6:42

Comments

0

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
answered Feb 10, 2018 at 15:10

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.