Alberto Alvarez
Alberto Alvarez

Reputation: 855

Changing the entries of a column of a matrix

I have the following matrix:

import numpy as np
A:

matrix([[ 1,  2,  3,  4],
    [ 3,  4, 10,  8]])

The question is how do I input the following restriction: if any number of a column in the matrix A is less than or equal to (<=) K (3), then change the last number of that column to minimum between the last entry of the column and 5? So basically, my matrix should transform to this:

A:

matrix([[ 1,  2,  3,  4],
    [ 3, 4, 5,  8]])

I tried this function:

A[-1][np.any(A <= 3, axis=0)] = np.maximum(A[-1], 5)    

But I have the following error:

TypeError: NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 2 dimensions

Upvotes: 2

Views: 136

Answers (2)

jpp
jpp

Reputation: 164843

Here is one way:

A[-1][np.logical_and(A[-1] > 5, np.any(A <= 3, axis=0))] = 5

# matrix([[1, 2, 3, 4],
#         [3, 4, 5, 8]])

This takes advantage of the fact you only need to change a number if it greater than 5. Therefore, the minimum criterion is taken care of by the A[-1] > 5 condition.

Upvotes: 0

cs95
cs95

Reputation: 403248

You should be using np.minimum here. Create a mask, and index, setting values accordingly.

B = np.array(A)
m = (B <= 3).any(0)
A[-1, m] = np.minimum(A[-1, m], 5)

A

matrix([[1, 2, 3, 4],
        [3, 4, 5, 8]])

Upvotes: 1

Related Questions