The Python Oracle

Numpy: Set false where anything to the left is false

--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------

Music by Eric Matyas
https://www.soundimage.org
Track title: Quiet Intelligence

--

Chapters
00:00 Numpy: Set False Where Anything To The Left Is False
01:08 Answer 1 Score 1
01:29 Answer 2 Score 1
01:54 Answer 3 Score 6
02:18 Accepted Answer Score 4
02:29 Thank you

--

Full question
https://stackoverflow.com/questions/5391...

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#python #python3x #numpy

#avk47



ANSWER 1

Score 6


The perfect tool exists :

np.logical_and.accumulate(survival,axis=1)

Example :

array([[False,  True, False,  True],
       [ True,  True, False,  True],
       [False,  True,  True,  True],
       [False,  True, False, False],
       [ True, False, False, False],
       [False,  True,  True,  True],
       [False, False,  True, False],
       [False, False,  True,  True]])

=>
array([[False, False, False, False],
       [ True,  True, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [ True, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])



ACCEPTED ANSWER

Score 4


Try not to use pure for loops when working with numpy arrays.

Use instead cumulative product against axis=1

arr.cumprod(1).astype(np.bool)



ANSWER 3

Score 1


By using np.argwhere:

import numpy as np


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

for arr in np.argwhere(bob == False):
    bob[arr[0],arr[1]:] = False

the above argwhere returns for each instance of false the row,column, i use those value to set the rest of the row to false (after each false).




ANSWER 4

Score 1


>>> mc = (8, 4)
>>> survival = np.random.random(mc) > np.random.random(mc)
>>> survival
array([[ True,  True,  True,  True],
       [ True, False, False,  True],
       [ True, False,  True,  True],
       [ True, False,  True, False],
       [False,  True, False, False],
       [ True,  True, False,  True],
       [ True,  True, False, False],
       [False, False,  True,  True]])

and

>>> death = [x.tolist().index(False) if False in x else -1 for x in survival]
>>> [s[ : d].tolist() + [False] * (survival.shape[1] - d) if d != -1 else s.tolist() for s, d in zip(survival, death)]
[[True, True, True, True],
 [True, False, False, False],
 [True, False, False, False],
 [True, False, False, False],
 [False, False, False, False],
 [True, True, False, False],
 [True, True, False, False],
 [False, False, False, False]]