Skip to content

Comparison Operators

NumPy supports element-wise comparison operations that return boolean arrays.

Basic Comparisons

1. Less Than

import numpy as np

def main():
    a = np.array([1, 5, 3, 7, 2])

    result = a < 5

    print(f"a = {a}")
    print(f"a < 5 = {result}")

if __name__ == "__main__":
    main()

Output:

a = [1 5 3 7 2]
a < 5 = [ True False  True False  True]

2. Greater Than

import numpy as np

def main():
    a = np.array([1, 5, 3, 7, 2])

    print(f"a = {a}")
    print(f"a > 3 = {a > 3}")
    print(f"a >= 3 = {a >= 3}")

if __name__ == "__main__":
    main()

3. Equality

import numpy as np

def main():
    a = np.array([1, 5, 3, 5, 2])

    print(f"a = {a}")
    print(f"a == 5 = {a == 5}")
    print(f"a != 5 = {a != 5}")

if __name__ == "__main__":
    main()

Array vs Array

1. Element-wise Comparison

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5])
    b = np.array([5, 4, 3, 2, 1])

    print(f"a = {a}")
    print(f"b = {b}")
    print()
    print(f"a < b  = {a < b}")
    print(f"a == b = {a == b}")
    print(f"a > b  = {a > b}")

if __name__ == "__main__":
    main()

2. 2D Arrays

import numpy as np

def main():
    a = np.array([[1, 2], [3, 4]])
    b = np.array([[2, 2], [2, 2]])

    print("a =")
    print(a)
    print()
    print("b =")
    print(b)
    print()
    print("a > b =")
    print(a > b)

if __name__ == "__main__":
    main()

Function Equivalents

1. np.less and np.greater

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5])

    print(f"a = {a}")
    print()
    print(f"np.less(a, 3) = {np.less(a, 3)}")
    print(f"np.greater(a, 3) = {np.greater(a, 3)}")
    print(f"np.less_equal(a, 3) = {np.less_equal(a, 3)}")
    print(f"np.greater_equal(a, 3) = {np.greater_equal(a, 3)}")

if __name__ == "__main__":
    main()

2. np.equal and np.not_equal

import numpy as np

def main():
    a = np.array([1, 2, 3, 2, 1])

    print(f"a = {a}")
    print(f"np.equal(a, 2) = {np.equal(a, 2)}")
    print(f"np.not_equal(a, 2) = {np.not_equal(a, 2)}")

if __name__ == "__main__":
    main()

3. Using out Parameter

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5])
    result = np.empty(5, dtype=bool)

    np.greater(a, 3, out=result)

    print(f"a = {a}")
    print(f"result = {result}")

if __name__ == "__main__":
    main()

Floating Point Comparison

1. Exact Equality Issues

import numpy as np

def main():
    a = 0.1 + 0.2
    b = 0.3

    print(f"0.1 + 0.2 = {a}")
    print(f"0.3 = {b}")
    print(f"0.1 + 0.2 == 0.3: {a == b}")  # False!

if __name__ == "__main__":
    main()

2. np.isclose

import numpy as np

def main():
    a = np.array([0.1 + 0.2, 1.0, 2.0])
    b = np.array([0.3, 1.0, 2.0001])

    print(f"a = {a}")
    print(f"b = {b}")
    print()
    print(f"a == b: {a == b}")
    print(f"np.isclose(a, b): {np.isclose(a, b)}")

if __name__ == "__main__":
    main()

3. np.allclose

import numpy as np

def main():
    a = np.array([1.0, 2.0, 3.0])
    b = np.array([1.0, 2.0, 3.0 + 1e-10])

    print(f"a = {a}")
    print(f"b = {b}")
    print()
    print(f"a == b (all): {np.all(a == b)}")
    print(f"np.allclose(a, b): {np.allclose(a, b)}")

if __name__ == "__main__":
    main()

Tolerance Parameters

1. rtol and atol

import numpy as np

def main():
    a = np.array([1.0, 100.0])
    b = np.array([1.001, 100.1])

    # Default: rtol=1e-5, atol=1e-8
    # |a - b| <= atol + rtol * |b|

    print(f"a = {a}")
    print(f"b = {b}")
    print()
    print(f"isclose (default): {np.isclose(a, b)}")
    print(f"isclose (rtol=0.01): {np.isclose(a, b, rtol=0.01)}")
    print(f"isclose (atol=0.1): {np.isclose(a, b, atol=0.1)}")

if __name__ == "__main__":
    main()

2. Practical Example

import numpy as np

def main():
    # Verify matrix inverse
    A = np.array([[1, 2], [3, 4]], dtype=float)
    A_inv = np.linalg.inv(A)

    product = A @ A_inv
    identity = np.eye(2)

    print("A @ A_inv =")
    print(product)
    print()
    print(f"Exactly equal to I: {np.all(product == identity)}")
    print(f"Close to I: {np.allclose(product, identity)}")

if __name__ == "__main__":
    main()

Combining Comparisons

1. Logical AND

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5, 6, 7])

    # Values between 3 and 6
    mask = (a >= 3) & (a <= 6)

    print(f"a = {a}")
    print(f"3 <= a <= 6: {mask}")
    print(f"Filtered: {a[mask]}")

if __name__ == "__main__":
    main()

2. Logical OR

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5, 6, 7])

    # Values less than 3 or greater than 5
    mask = (a < 3) | (a > 5)

    print(f"a = {a}")
    print(f"a < 3 or a > 5: {mask}")
    print(f"Filtered: {a[mask]}")

if __name__ == "__main__":
    main()

3. Logical NOT

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5])

    mask = a > 3

    print(f"a = {a}")
    print(f"a > 3: {mask}")
    print(f"~(a > 3): {~mask}")

if __name__ == "__main__":
    main()

Aggregation

1. np.any and np.all

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5])

    print(f"a = {a}")
    print()
    print(f"Any element > 4: {np.any(a > 4)}")
    print(f"All elements > 0: {np.all(a > 0)}")
    print(f"All elements > 2: {np.all(a > 2)}")

if __name__ == "__main__":
    main()

2. Count True Values

import numpy as np

def main():
    a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

    mask = a > 5

    print(f"a = {a}")
    print(f"a > 5: {mask}")
    print(f"Count (sum): {np.sum(mask)}")
    print(f"Count (count_nonzero): {np.count_nonzero(mask)}")

if __name__ == "__main__":
    main()

3. With axis

import numpy as np

def main():
    a = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

    print("a =")
    print(a)
    print()
    print(f"Any > 5 per column: {np.any(a > 5, axis=0)}")
    print(f"Any > 5 per row: {np.any(a > 5, axis=1)}")
    print(f"All > 0 per column: {np.all(a > 0, axis=0)}")

if __name__ == "__main__":
    main()

np.array_equal

1. Array Equality

import numpy as np

def main():
    a = np.array([1, 2, 3])
    b = np.array([1, 2, 3])
    c = np.array([1, 2, 4])

    print(f"a = {a}")
    print(f"b = {b}")
    print(f"c = {c}")
    print()
    print(f"np.array_equal(a, b): {np.array_equal(a, b)}")
    print(f"np.array_equal(a, c): {np.array_equal(a, c)}")

if __name__ == "__main__":
    main()

2. Different Shapes

import numpy as np

def main():
    a = np.array([1, 2, 3])
    b = np.array([[1, 2, 3]])

    print(f"a shape: {a.shape}")
    print(f"b shape: {b.shape}")
    print(f"np.array_equal(a, b): {np.array_equal(a, b)}")

if __name__ == "__main__":
    main()

Applications

1. Boolean Indexing

import numpy as np

def main():
    scores = np.array([85, 62, 91, 45, 78, 55])

    passing = scores >= 60

    print(f"Scores: {scores}")
    print(f"Passing mask: {passing}")
    print(f"Passing scores: {scores[passing]}")
    print(f"Failing scores: {scores[~passing]}")

if __name__ == "__main__":
    main()

2. Conditional Assignment

import numpy as np

def main():
    a = np.array([1, -2, 3, -4, 5])

    # Replace negatives with zero
    a[a < 0] = 0

    print(f"Result: {a}")

if __name__ == "__main__":
    main()

3. Data Validation

import numpy as np

def main():
    data = np.array([1.0, 2.0, np.nan, 4.0, np.inf])

    valid = np.isfinite(data)

    print(f"Data: {data}")
    print(f"Is finite: {valid}")
    print(f"Valid data: {data[valid]}")

if __name__ == "__main__":
    main()

Summary Table

1. Comparison Operators

Operator Function Description
< np.less Less than
<= np.less_equal Less or equal
> np.greater Greater than
>= np.greater_equal Greater or equal
== np.equal Equal
!= np.not_equal Not equal

2. Floating Point

Function Description
np.isclose Element-wise approximate equality
np.allclose All elements approximately equal
np.array_equal Exact array equality

3. Logical Operators

Operator Function Description
& np.logical_and Element-wise AND
\| np.logical_or Element-wise OR
~ np.logical_not Element-wise NOT
^ np.logical_xor Element-wise XOR