Python AND operator on two boolean lists - how?

前端 未结 9 2079
感动是毒
感动是毒 2020-11-28 09:36

I have two boolean lists, e.g.,

x=[True,True,False,False]
y=[True,False,True,False]

I want to AND these lists together, with the expected o

9条回答
  •  有刺的猬
    2020-11-28 10:33

    Thanks for the answer @Martijn Pieters and @Tony. I dig into the timing of the various options we have to make the AND of two lists and I would like to share my results, because I found them interesting.

    Despite liking a lot the pythonic way [a and b for a,b in zip(x,y) ], turns out really slow. I compare with a integer product of arrays (1*(array of bool)) * (1*(array of bool)) and it turns out to be more than 10x faster

    import time
    import numpy as np
    array_to_filter = np.linspace(1,1000000,1000000)                # 1 million of integers :-)
    value_limit = 100
    cycles = 100
    
    # METHOD #1:  [a and b for a,b in zip(x,y) ]
    t0=time.clock()
    for jj in range(cycles):
        x = array_to_filter MAX-value_limit
        y = array_to_filter>value_limit                          # filter the values < value_limit
        z= [a and b for a,b in zip(x,y) ]                       # AND
        filtered = array_to_filter[z]
    print('METHOD #1 = %.2f s' % ( (time.clock()-t0)))
    
    
    
    # METHOD 1*(array of bool) AND  1*(array of bool)
    t0=time.clock()
    for jj in range(cycles):
        x = 1*(array_to_filter MAX-value_limit
        y = 1*(array_to_filter>value_limit)                          # filter the values < value_limit
        z = x*y                                                     # AND
        z = z.astype(bool)                                          # convert back to array of bool
        filtered = array_to_filter[z]
    print('METHOD #2 = %.2f s' % ( (time.clock()-t0)))
    

    The results are

    METHOD #1 = 15.36 s
    METHOD #2 = 1.85 s
    

    The speed is almost affected equally by the size of the array or by the number of cycles.
    I hope I helped someone code to be faster. :-)

提交回复
热议问题