# Editing Subsets#

Sometimes we want to modify a *part* of a matrix. For example, suppose we were working with our survey data, and we want to multiply all the income values by `1.02`

to adjust for inflation that has occurred since the survey. Obviously, if we just multiplied the matrix by `1.02`

, we’d also modify things like education and age:

```
import numpy as np
survey = np.array(
[[20, 22_000, 12], [35, 65_000, 16], [55, 19_000, 11], [45, 35_000, 12]]
)
survey
```

```
array([[ 20, 22000, 12],
[ 35, 65000, 16],
[ 55, 19000, 11],
[ 45, 35000, 12]])
```

```
survey * 1.02
```

```
array([[2.040e+01, 2.244e+04, 1.224e+01],
[3.570e+01, 6.630e+04, 1.632e+01],
[5.610e+01, 1.938e+04, 1.122e+01],
[4.590e+01, 3.570e+04, 1.224e+01]])
```

What we can do instead is extract the column with income, modify it, then replace the old income column with our updated column:

```
income_column = survey[:, 1] # Extract income
adjusted_income = income_column * 1.02 # Adjust income
survey[:, 1] = adjusted_income # Replace income with new values!
survey
```

```
array([[ 20, 22440, 12],
[ 35, 66300, 16],
[ 55, 19380, 11],
[ 45, 35700, 12]])
```

Or, if we wanted, we could actually do all this in one step:

```
# Re-make survey so it hasn't been adjusted for inflation
survey = np.array(
[[20, 22_000, 12], [35, 65_000, 16], [55, 19_000, 11], [45, 35_000, 12]]
)
```

```
# Now adjust income in one step!
survey[:, 1] = survey[:, 1] * 1.02
survey
```

```
array([[ 20, 22440, 12],
[ 35, 66300, 16],
[ 55, 19380, 11],
[ 45, 35700, 12]])
```

And this is *especially* powerful if we subset on BOTH rows and columns. Suppose, for example, we wanted to see what people’s incomes would look like if anyone who didn’t finish high school (`education < 12`

) got a tax credit of 10,000 dollars:

```
survey[survey[:, 2] < 12, 1] = survey[survey[:, 2] < 12, 1] + 10000
```

```
survey
```

```
array([[ 20, 22440, 12],
[ 35, 66300, 16],
[ 55, 29380, 11],
[ 45, 35700, 12]])
```

## Views and Copies with Matrices#

When it comes to views and copies, the same rules apply to matrices as applied to vectors: if you create a subset through simple indexing, the result will be a view; if you create a subset by a different method, you get a copy!

And that’s it! Now you’re a matrix pro.

## Exercises#

Using

`np.arange`

, create a 3 x 5 matrix with all the numbers from 0 to 14. Assignment to the variable`my_matrix`

.Subset the third and fourth columns of the matrix (the columns starting with 2 and 3) with simple indexing. Assign the subset to the variable

`m2`

.Change the top, left-most element of your new matrix

`m2`

to`-99`

.Without running any code, try and predict what

`my_matrix`

currently looks like.Now check

`my_matrix`

—does it look how you expected? Why or why not?