# [Numpy-discussion] Quikest way to create a diagonal matrix ?

Joris De Ridder Joris.DeRidder@ster.kuleuven...
Wed Mar 26 10:21:38 CDT 2008

```On 26 Mar 2008, at 15:36, lorenzo bolla wrote:

> numpy.tri
>
> In [31]: T = numpy.tri(m)
>
> In [32]: z.T * T + z * T.T
> Out[32]:
> array([[  0.,   1.,   2.,   3.,   4.],
>        [  1.,  12.,   7.,   8.,   9.],
>        [  2.,   7.,  24.,  13.,  14.],
>        [  3.,   8.,  13.,  36.,  19.],
>        [  4.,   9.,  14.,  19.,  48.]])

You still have to subtract the diagonal:

def f(z):
A = tri(z.shape[0], dtype = z.dtype)
X = z.T * A + z * A.T
X[range(A.shape[0]),range(A.shape[0])] -= z.diagonal()
return X

The suggestion of Alexandre seems to be about 4 times as fast, though.

But I love the way you obfuscate things by having "T" for both the tri-
matrix as the transpose method. :-)
It get's even better with numpy matrices. Next year, my students will
see something like
I.H-T.H*T.I+I.I*H.I+T.T*H.H-H.I
Refreshing! ;-)

Cheers,
Joris

Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm

```