# [Numpy-discussion] identity

Keith Goodman kwgoodman@gmail....
Wed Aug 12 09:24:36 CDT 2009

```On Wed, Aug 12, 2009 at 1:31 AM, Lars
> Hi,
>
> a colleague made me aware of a speed issue with numpy.identity. Since he was
> using numpy.diag(numpy.ones(N)) before, he expected identity to be at least as
> fast as diag. But that is not the case.
>
> We found that there was a discussion on the list (July, 20th; "My identity" by
> Keith Goodman). The presented solution was much faster. Someone wondered if
> But I got something different:
>
> In [1]:import numpy
>
> In [2]:numpy.__version__
> Out[2]:'1.4.0.dev7301'
>
> In [3]:numpy.identity??
> [...]
> def identity(n, dtype=None):
>    """
>    [...]
>    """
>    a = array([1]+n*[0],dtype=dtype)
>    b = empty((n,n),dtype=dtype)
>
>    # Note that this assignment depends on the convention that since the a
>    # array is shorter than the flattened b array, then the a array will
>    # be repeated until it is the appropriate size. Given a's construction,
>    # this nicely sets the diagonal to all ones.
>    b.flat = a
>    return b
>
> instead of (mail by Keith Goodman):
>
> def myidentity(n, dtype=None):
>    a = zeros((n,n), dtype=dtype)
>    a.flat[::n+1] = 1
>    return a
>
>
> Did I look at the wrong place or is there a reason to keep the slow version of
> identity?

Things tend to get lost on the mailing list. The next step would be to
file a ticket on the numpy trac. (I've never done that) That would
increase the chance of someone important taking a look at it.
```