[PYTHON MATRIX-SIG] take() in 1.0a2 (longish, sorry)

Carlos Fonseca fonseca@gaivota.demon.co.uk
Sun, 18 Aug 1996 16:21:07 +0100 (BST)

On Sun, 18 Aug 1996, Konrad Hinsen wrote:

>    I.e., when take is given a 2 dimensional indices array, it adds yet
>    another dimension to a. This should not happen if take(a,argsort(a,-1),-1) 
> I hope that this intentional, since it is a very useful function
> for the construction of higher-rank arrays.

But the point is that higher-rank arrays can be easily and efficiently
constructed by adding dummy dimensions and relying on broadcasting,
whereas the reverse is not possible if functions insist on producing
higher-rank arrays. At least, it means that more memory must be allocated
before the higher-rank arrays can be indexed at all.

>    is to be equivalent to sort(a,-1). Note that, in the example above,
> If sort(a,-1) is what you want, then that is what you should write.
> take() is meant for different (and much more diverse) applications,
> and I don't see a reason to limit its flexibility just to create
> a less efficient synonym for sort().

I have answered this in my previous message. Also, see above.

> My definition for take(), using the convenient J concepts of
> frames and cells, would be: the result has the frames of the
> index argument with elements picked from the value argument,
> i.e. if
>    b = take(a, i, axis)
> then
>    b[n_1,..,n_k] = a[(axis-1)*(All,), i[n_1,..,n_k], ...]
> with k being the rank of i.
> Konrad.

This behaviour can be achieved efficiently with the definition I
proposed via broadcasting. The opposite behaviour can only be achived from
this one, if at all, via indexing. Meanwhile, lots of memory have already
had to be allocated.


MATRIX-SIG  - SIG on Matrix Math for Python

send messages to: matrix-sig@python.org
administrivia to: matrix-sig-request@python.org