[SciPy-User] From 1-D boolean array to integer index
Tue Oct 11 15:38:08 CDT 2011
Thanks for the ideas everyone. Some clarification: the 1d bool array
represents the bits of the integer I'm interested in. I have binary
observations in a vector of length ~10, so the integer index will be the
particular combination of 1's and 0's in the vector.
In this case, the array will not be very long (~10 elements) but the
conversion needs to be fast (part of an inner loop).
Here's some timings on your candidate suggestions:
size = 10
b_array = sp.rand(size) < .5
# eat's suggestion
place_values = 2**sp.arange(size-1, -1, -1)
%timeit (b_array * place_values).sum()
100000 loops, best of 3: 4.83 us per loop
# Alok's suggestion
bit_shift = sp.arange(size-1, -1, -1)
100000 loops, best of 3: 7.58 us per loop
# Oleksandr's suggestion
string_format = size * '%d'
%timeit int( string_format % tuple(b_array) ,2)
100000 loops, best of 3: 7.24 us per loop
# my original idea
%timeit int(''.join(['1' if e else '0' for e in b_array]), 2)
1000000 loops, best of 3: 1.49 us per loop
I'm kinda surprised by the timings-- building a new list, doing a string
join, then converting the string a an integer is faster than bit-shift &
summation or multiplication & summation. And it seems that python's string
formatting operator is pretty efficient as well! Just as fast as some of
the other ops.
Thanks again for the suggestions-- Guess I'll stick with my current
Xie Lab, UC Irvine
On Tue, Oct 11, 2011 at 12:25 PM, Alan G Isaac <email@example.com> wrote:
> On 10/11/2011 1:29 PM, Jacob Biesinger wrote:
> > I have a 1-D bool array which I'd like to convert to an integer index.
> Sounds like you may be able to just use your bool array:
> >>> idx = np.array([True, False, True])
> >>> a = np.random.random(3)
> >>> a
> array([ 0.04818879, 0.49417941, 0.70470834])
> >>> a[idx]
> array([ 0.04818879, 0.70470834])
> Alan Isaac
> SciPy-User mailing list
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the SciPy-User