Nice approach.
I wrote a small benchmark:
def comparing_idx_search_methods():
    import random
    import time

    def bisect_search(nuclears, x):
        idx = bisect_left(nuclears, x)
        return idx

    def pytorch_search(nuclears, x):
        mat_tmp = torch.min((nuclears > x), 0)
        return mat_tmp[1].item() + 1

    number_of_iterations = 100000
    nuclears = [0, 0.1, 0.15, 0.2, 0.3, 0.33, 0.5, 0.51, 0.8, 1]

    x_s = [random.random() for _ in range(number_of_iterations)]

    start = time.time()
    for val in x_s:
        idx = bisect_search(nuclears, val)
    end = time.time()
    execution_time = end - start
    print("bisect: {} seconds".format(round(execution_time, 2)))

    start = time.time()
    nuclears = torch.Tensor(nuclears)
    for val in x_s:
        idx = pytorch_search(nuclears, val)
    end = time.time()
    execution_time = end - start
    print("pytorch: {} seconds".format(round(execution_time, 2)))

and basic output is:
bisect: 0.06 seconds
pytorch: 2.17 seconds

Of course - the reason is that bisect uses binary search and does not run through all elements.
But it was a nice try - I thought maybe pytorch uses something under the hood and it would be faster.
I think maybe the solution has to be connected with how maxpool works but I don’t know where to dig next.