Boolean numpy arrays

Boolean arrays

A boolean array is a numpy array with boolean (True/False) values. Such array can be obtained by applying a logical operator to another numpy array:

import numpy as np

a = np.reshape(np.arange(16), (4,4)) # create a 4x4 array of integers
print(a)

[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]

large_values = (a > 10) # test which elements of a are greated than 10
print(large_values)

[[False False False False] [False False False False] [False False False True] [ True True True True]]

even_values = (a%2 == 0) # test which elements of a are even
print(even_values)

[[ True False True False] [ True False True False] [ True False True False] [ True False True False]]

Logical operations on boolean arrays

Boolean arrays can be combined using logical operators:

operator

meaning

~

negation (logical “not”)

&

logical “and”

|

logical “or”

b = ~(a%3 == 0) # test which elements of a are not divisible by 3

print('array a:\n{}\n'.format(a))
print('array b:\n{}'.format(b))

array a: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]

array b: [[False True True False] [ True True False True] [ True False True True] [False True True False]]

c = (a%2 == 0) | (a%3 == 0) # test which elements of a are divisible by either 2 or 3

print('array a:\n{}\n'.format(a))
print('array c:\n{}'.format(c))

array a: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]

array c: [[ True False True True] [ True False True False] [ True True True False] [ True False True True]]

d = (a%2 == 0) & (a%3 == 0) # test which elements of a are divisible by both 2 and 3

print('array a:\n{}\n'.format(a))
print('array d:\n{}'.format(d))

array a: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]

array d: [[ True False False False] [False False True False] [False False False False] [ True False False False]]

Indexing with boolean arrays

Boolean arrays can be used to select elements of other numpy arrays. If a is any numpy array and b is a boolean array of the same dimensions then a[b] selects all elements of a for which the corresponding value of b is True.

a = np.reshape(np.arange(16), (4,4)) # create a 4x4 array of integers
print(a)

[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]

b = (a%2 == 0) # test which elements of a are even
print(b)

[[ True False True False] [ True False True False] [ True False True False] [ True False True False]]

print(a[b]) # select all even elements of the array a

[ 0 2 4 6 8 10 12 14]

We can use this to modify elements of an array that satisfy a logical condition:

a[a%2 == 0] = 100 # set values of all even elements of the array a to 100
print(a)

[[100 1 100 3] [100 5 100 7] [100 9 100 11] [100 13 100 15]]

In the next example we create two numpy arrays, x and y, and set all values of x that are smaller that the corresponding values of y to -1:

x = np.random.random((3,3)) # create a 3x3 array of random numbers
y = np.random.random((3,3))

print('array x:\n{}\n'.format(x))
print('array y:\n{}'.format(y))

array x: [[ 0.76755354 0.39784664 0.60511187] [ 0.9584705 0.42498244 0.71316056] [ 0.30123811 0.2202371 0.64291291]]

array y: [[ 0.58221015 0.09077814 0.26814573] [ 0.91636671 0.41542893 0.07005894] [ 0.83128003 0.81483812 0.56582282]]

x[x < y] = -1
print(x)

[[ 0.76755354 0.39784664 0.60511187] [ 0.9584705 0.42498244 0.71316056] [-1. -1. 0.64291291]]