Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to efficiently turn a boolean numpy array into threshold boolean array?

I'm using Python 2.7 and NumPy to work on big arrays of boolean values.

I have an array A, that is something like this:

>>> A
array([[[False, False, True, True, True],
        [False, False, False, True, True],
        [False, False, True, True, True],
        [False, False, False, True, True],
        [False, False, False, False, True]],

       [[False, True, True, True, True],
        [False, True, True, True, True],
        [False, False, True, True, True],
        [False, True, True, True, True],
        [False, False, True, True, True]]])

I have to turn it in a boolean array like this:

>>> B
array([[[True, False, True, True, True],
        [True, True, False, True, True],
        [True, False, True, True, True],
        [True, True, False, True, True],
        [True, True, True, False, True]],

       [[False, True, True, True, True],
        [False, True, True, True, True],
        [True, False, True, True, True],
        [False, True, True, True, True],
        [True, False, True, True, True]]])

So the idea is that the last False value of each row should remain and any other value should become True. I need to create it in order to use it as a mask for another array.

Is there a way to do it with NumPy without using for loops (that are quite slow)?

like image 776
ProGM Avatar asked Mar 03 '26 06:03

ProGM


1 Answers

You could also use the xor operator ^ for that purpose. Simply "leftshift" the array by one and add True values to the right and then xor the new and the old array:

A = np.array([[False, False, True, True, True],
              [False, False, False, True, True],
              [False, False, True, True, True],
              [False, False, False, True, True],
              [False, False, False, False, True]])

X = np.hstack((A[:,1:], 
               np.array(np.ones((A.shape[0], 1)), dtype=np.bool))))
>>> array([[False, True, True, True, True],
           [False, False, True, True, True],
           [False, True, True, True, True],
           [False, False, True, True, True],
           [False, False, False, True, True]])

np.invert(A ^ X)
>>> array([[True, False, True, True, True],
           [True, True, False, True, True],
           [True, False, True, True, True],
           [True, True, False, True, True],
           [True, True, True, False, True]])

This only works if all False values are left and followed by only True values.

like image 70
hildensia Avatar answered Mar 05 '26 19:03

hildensia



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!