# [SOLVED] Extract sub-array from 2D array using logical indexing – python

## Issue

I am trying to extract a sub-array using logical indexes as,

``````a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
a
Out[45]:
array([[ 1,  2,  3,  4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
b = np.array([False, True, False, True])
a[b, b]
Out[49]: array([ 6, 16])
``````

python evaluates the logical indexes in b per element of a. However in matlab you can do something like

``````>> a = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]

a =

1     2     3     4
5     6     7     8
9    10    11    12
13    14    15    16

>> b = [2 4]

b =

2     4

>> a(b, b)

ans =

6     8
14    16
``````

how can I achieve the same result in python without doing,

``````c = a[:, b]
c[b,:]
Out[51]:
array([[ 6,  8],
[14, 16]])
``````

## Solution

Numpy supports logical indexing, though it is a little different than what you are familiar in MATLAB. To get the results you want you can do the following:

``````a[b][:,b]  # first brackets isolates the rows, second brackets isolate the columns
Out[27]:
array([[ 6,  8],
[14, 16]])
``````

The more "numpy" method will be understood after you will understand what happend in your case.
`b = np.array([False, True, False, True])` is similar to `b=np.array([1,3])` and will be easier for me to explain. When writing `a[[1,3],[1,3]]` what happens is that numpy crates a (2,1) shape array, and places `a[1,1]` in the `[0]` location and `a[3,3]` in the second location. To create an output of shape (2,2), the indexing must have the same dimensionality. Therefore, the following will get your result:

``````a[[[1,1],[3,3]],[[1,3],[1,3]]]
Out[28]:
array([[ 6,  8],
[14, 16]])
``````

Explanation:

The indexing arrays are:

``````temp_rows = np.array([[1,1],
[3,3]])
temp_cols = np.array([[1,3],
[1,3])
``````

both arrays have dimensions of (2,2) and therefore, numpy will create an output of shape (2,2). Then, it places `a[1,1]` in location [0,0], `a[1,3]` in [0,1], `a[3,1]` in location [1,0] and `a[3,3]` in location [1,1]. This can be expanded to any shape but for your purposes, you wanted a shape of (2,2)

After figuring this out, you can make things even simpler by utilizing the fact you if you insert a (2,1) array in the 1st dimension and a (1,2) array in the 2nd dimension, numpy will perform the broadcasting, similar to the MATLAB operation. This means that by using:

``````temp_rows = np.array([[1],[3]])
temp_cols = np.array([1,3])
``````

you can do:

``````a[[[1],[3]], [1,3])
Out[29]:
array([[ 6,  8],
[14, 16]])
``````

Answered By – Tomer Geva

Answer Checked By – Gilberto Lyons (BugsFixing Admin)