Discussion:
[Numpy-discussion] offset in fill diagonal
j***@gmail.com
2017-01-21 15:10:53 UTC
Permalink
Is there a simple way to fill in diagonal elements in an array for other
than main diagonal?

As far as I can see, the diagxxx functions that have offset can only read
and not inplace modify, and the functions for modifying don't have offset
and only allow changing the main diagonal.

Usecase: creating banded matrices (2-D arrays) similar to toeplitz.


Josef
Julian Taylor
2017-01-21 15:23:33 UTC
Permalink
Post by j***@gmail.com
Is there a simple way to fill in diagonal elements in an array for other
than main diagonal?
As far as I can see, the diagxxx functions that have offset can only
read and not inplace modify, and the functions for modifying don't have
offset and only allow changing the main diagonal.
Usecase: creating banded matrices (2-D arrays) similar to toeplitz.
you can construct index arrays or boolean masks to index using the
np.tri* functions.
e.g.

a = np.arange(5*5).reshape(5,5)
band = np.tri(5, 5, 1, dtype=np.bool) & ~np.tri(5, 5, -2, dtype=np.bool)
a[band] = -1
Ian Henriksen
2017-01-21 19:26:12 UTC
Permalink
Post by Julian Taylor
Post by j***@gmail.com
Is there a simple way to fill in diagonal elements in an array for other
than main diagonal?
As far as I can see, the diagxxx functions that have offset can only
read and not inplace modify, and the functions for modifying don't have
offset and only allow changing the main diagonal.
Usecase: creating banded matrices (2-D arrays) similar to toeplitz.
you can construct index arrays or boolean masks to index using the
np.tri* functions.
e.g.
a = np.arange(5*5).reshape(5,5)
band = np.tri(5, 5, 1, dtype=np.bool) & ~np.tri(5, 5, -2, dtype=np.bool)
a[band] = -1
_______________________________________________
NumPy-Discussion mailing list
https://mail.scipy.org/mailman/listinfo/numpy-discussion
You can slice the array you're filling before passing it to fill_diagonal.
For example:

import numpy as np
a = np.zeros((4, 4))
b = np.ones(3)
np.fill_diagonal(a[1:], b)
np.fill_diagonal(a[:,1:], -b)

yields

array([[ 0., -1., 0., 0.],
[ 1., 0., -1., 0.],
[ 0., 1., 0., -1.],
[ 0., 0., 1., 0.]])

Hope this helps,

Ian Henriksen

Continue reading on narkive:
Loading...