[Numpy-discussion] offset in fill diagonal

Ian Henriksen insertinterestingnamehere at gmail.com
Sat Jan 21 14:26:12 EST 2017


On Sat, Jan 21, 2017 at 9:23 AM Julian Taylor <jtaylor.debian at googlemail.com>
wrote:

> On 21.01.2017 16:10, josef.pktd at gmail.com wrote:
> > 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
> NumPy-Discussion at scipy.org
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20170121/86fc8e3b/attachment.html>


More information about the NumPy-Discussion mailing list