[Numpy-discussion] Functions for indexing into certain parts of an array (2d)

Fernando Perez fperez.net at gmail.com
Sun Jun 7 04:28:51 EDT 2009

On Sat, Jun 6, 2009 at 2:01 PM, Robert Kern <robert.kern at gmail.com> wrote:
> On Sat, Jun 6, 2009 at 13:30, Fernando Perez <fperez.net at gmail.com> wrote:

> Oops! Never mind. I thought it was using mask_indices like the others.
>  There is a neat trick for accessing the diagonal of an existing array
> (a.flat[::a.shape[1]+1]), but it won't work to implement
> diag_indices().

Neat!  A version valid for all dimensionalities (always writing the
main diagonal) is:

    if a.ndim == 2:
        # Explicit, fast formula for the common case
        step = a.shape[1] + 1
        step = np.cumprod((1,)+a.shape[:-1]).sum()

    a.flat[::step] = val

Do you want this as part of the patch?  If so, where  should it go
(it's not 2-d only)?  If you want it, should I add a check for equal
dimensions? (I'd be inclined to  allow non-square in the 2-d case but
to avoid it in other cases, where the formula completely breaks down.
In 2-d it can be useful to fill the diagonal of rectangular arrays.)

>> - Are doctests considered enough testing for numpy, or are separate
>> tests also required?
> I don't think we have the testing machinery hooked up to test the
> docstrings on the functions themselves (we made the decision to keep
> examples as clean and pedagogical as possible rather than complete
> tests). You can use doctests in the test directories, though.

Got it.

>> - Where should these go?
> numpy/lib/twodim_base.py to go with their existing counterparts, I would think.

OK.  Will send it in when I know whether you'd want the fill_diagonal
one, and where that should go.

I'll make a ticket with the patch attached.

>> - Any interest in also having the stuff below?  I'm needing to build
>> structured random arrays a lot (symmetric, anti-symmetric, symmetric
>> with  a particular diagonal, etc), and these are coming in handy.  If
>> you want them, I'll put the whole thing together (these use the
>> indexing utilities from the previous suggestion).
> I wouldn't mind having a little gallery of matrix generators in numpy,
> but someone else has already made a much more complete collection:
>  http://pypi.python.org/pypi/rogues

Ah, great!  This stuff would be really nice to have in numpy/scipy,
actually.  A lot more than my 15-minute hack :)

OK, I'll keep mine for symmetric/antisymmetric random matrices, since
that's what I need now, but it's great to know about that resource.



More information about the NumPy-Discussion mailing list