# Advanced Indexing {:.no_toc} ## The goal Beside slicing there is something called advanced indexing Questions to [David Rotermund](mailto:davrot@uni-bremen.de) ## Boolean Array​ We can use Boolean arrays for more complicate indexing: ```python import numpy as np a = np.arange(1,10).reshape(3,3) b = np.zeros_like(a) b[a.sum(axis=1) > 6, :] = 1 print(a) print() print(b) ``` Output: ```python [[1 2 3] [4 5 6] [7 8 9]] [[0 0 0] [1 1 1] [1 1 1]] ``` Behind the curtains more or less this happens:​ ```python import numpy as np a = np.arange(1, 10).reshape(3, 3) b = np.zeros_like(a) temp_0 = a.sum(axis=1) temp_1 = temp_0 > 6 temp_2 = np.nonzero(temp_1) b[temp_2] = 1 print(temp_0) print() print(temp_1) print() print(temp_2) print() print(b) ``` Output: ```python [ 6 15 24] [False True True] (array([1, 2]),) [[0 0 0] [1 1 1] [1 1 1]] ``` ## Index vs Slices / Views This procedure is called indexing: ```python import numpy as np a = np.arange(0, 10) idx = np.arange(2,5) b = a[idx] print(idx) # -> [2 3 4] print() print(b) # -> [2 3 4] print() print(np.may_share_memory(a,b)) # -> False ``` While this is called slicing: ```python import numpy as np a = np.arange(0, 10) b = a[2:5] print(b) # -> [2 3 4] print() print(np.may_share_memory(a, b)) # -> True ``` As you can see lies the biggest different in the creation of a view when we use slicing. Indexing creates a new object instead.