TLDR:
Use Kelly Bundy answer. No need for more import. Even work without importing numpy by yourself if you got the array for other package.
If only 3 array, use OP answer.
Explanation:
After running the test again and again, all three (OP, AndrejH, and Kelly Bundy) results is fast and inconsistent which one is the best. Someone with better profiler can do better benchmark.
Benchmark:
import functools
import numpy as np
a = np.random.randint(1,10,(1000,100))
b = np.random.randint(1,10,(1000,100))
c = np.random.randint(1,10,(1000,100))
d = np.random.randint(1,10,(1000,100))
# arbitrary number of chains
%timeit (a <= b) & (b <= c) & (c <= d)
%timeit functools.reduce(np.logical_and, [a <= b, b <= c, c <= d])
%timeit np.logical_and.reduce([a <= b, b <= c, c <= d])
%timeit np.all([a<=b, b<=c, c<=d], axis=0)
%timeit np.apply_along_axis(lambda arr: all(arr[1:] >= arr[:-1]), 0, np.stack([a, b, c, d]))
1.02 ms ± 166 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
930 µs ± 93.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.09 ms ± 11.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.52 ms ± 360 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.1 s ± 276 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# only up to three array
%timeit (a <= b) & (b <= c)
%timeit functools.reduce(np.logical_and, [a <= b, b <= c])
%timeit np.logical_and.reduce([a <= b, b <= c])
%timeit np.all([a <= b, b <= c], axis=0)
%timeit np.logical_and((a <= b), (b <= c))
%timeit np.apply_along_axis(lambda arr: all(arr[1:] >= arr[:-1]), 0, np.stack([a, b, c]))
927 µs ± 457 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
559 µs ± 25.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
733 µs ± 39.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
819 µs ± 42.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
585 µs ± 40.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.01 s ± 69.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
OLD BENCHMARK
Chaining (best: AndrejH)
%timeit functools.reduce(np.logical_and, [a <= b, b <= c, c <= d]) # AndrejH
6.27 µs ± 244 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.all([a<=b, b<=c, c<=d], axis=0) # Quang Hoang
59.7 µs ± 8.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Chaining up to three array (best: OP)
%timeit np.logical_and((a <= b), (b <= c)) # OP
3.8 µs ± 339 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit functools.reduce(np.logical_and, [a <= b, b <= c]) # AndrejH
4.2 µs ± 75.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.all([a <= b, b <= c], axis=0) # Quang Hoang
45.6 µs ± 6.13 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)