Let's say we have a n x n matrix. Taking n=4 as example:
x x x x
x x x x
x x x x
x x x x
This is what I want to achieve:
When cut=1, given from function parameter, the matrix becomes:
x x x x
x x x x
x x x x
x x x 0
When cut=3:
x x x x
x x x 0
x x 0 0
x 0 0 0
When cut=5:
x x 0 0
x 0 0 0
0 0 0 0
0 0 0 0
As we can see, the diagonal is being cut like a forward-slash, everything under the first slash would be zeros out.
I am using numpy's matrix facility to generate matrices, but I don't know how to code such algorithm. Any help please?
You can always assume this matrix will be an n x n matrix and cut < 2n - 1
You can use np.tri
to generate a matrix that contains ones below a given diagonal and zeros above. Since you want the bottom-right corner zeroed out, we have to flip left and right:
bottom_right = lambda N, k: np.fliplr(np.tri(N, k=k-N)) == 1
For example, bottom_right(4, 2)
creates the following boolean matrix:
array([[False, False, False, False],
[False, False, False, False],
[False, False, False, True],
[False, False, True, True]], dtype=bool)
You can use that as a slice to zero out the corner:
a = np.ones((4, 4))
a[bottom_right(4, 2)] = 0
a
is now
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 0.],
[ 1., 1., 0., 0.]])
Another way:
A one-liner based on Mathias711's answer:
f = lambda a, k: np.fliplr(np.triu(np.fliplr(a), k=k-a.shape[0]+1))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With