Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vectorized conversion of decimal integer array to binary array in numpy

I'm trying to convert an array of integers into their binary representations in python. I know that native python has a function called bin that does this. Numpy also has a similar function: numpy.binary_repr.

The problem is that none of these are vectorized approaches, as in, they only take one single value at a time. So, in order for me to convert a whole array of inputs, I have to use a for-loop and call these functions multiple times, which isn't very efficient.

Is there any way to perform this conversion without for-loops? Are there any vectorized forms of these functions? I've tried numpy.apply_along_axis but no luck. I've also tried using np.fromiter and map and it was also a no go.

I know similar questions have been asked a few other times (like here), but none of the answers given are actually vectorized.

Pointing me into any direction would be greatly appreciated!

Thanks =)

like image 959
Felipe D. Avatar asked Sep 14 '25 17:09

Felipe D.


1 Answers

The easiest way is to use binary_repr with vectorize, it will preserve the original array shape, e.g.:

binary_repr_v = np.vectorize(np.binary_repr)
x = np.arange(-9, 21).reshape(3, 2, 5)
print(x)
print()
print(binary_repr_v(x, 8))

The output:

[[[-9 -8 -7 -6 -5]
  [-4 -3 -2 -1  0]]

 [[ 1  2  3  4  5]
  [ 6  7  8  9 10]]

 [[11 12 13 14 15]
  [16 17 18 19 20]]]

[[['11110111' '11111000' '11111001' '11111010' '11111011']
  ['11111100' '11111101' '11111110' '11111111' '00000000']]

 [['00000001' '00000010' '00000011' '00000100' '00000101']
  ['00000110' '00000111' '00001000' '00001001' '00001010']]

 [['00001011' '00001100' '00001101' '00001110' '00001111']
  ['00010000' '00010001' '00010010' '00010011' '00010100']]]
like image 81
aparpara Avatar answered Sep 17 '25 06:09

aparpara