[Numpy-discussion] Re: Newbie indexing question and print order

Lennart Ohlsson lennart.ohlsson at cs.lth.se
Wed Apr 5 08:12:20 EDT 2006


Hi,

Although I mainly use for 2D takes here is an nd-version of such a function:

def vtake(a, indices):
    """Corresponding to take in numpy but with vector valued indices"""
    indexrank = indices.shape[-1]
    flattedindex = 0
    for i in range(indexrank):
        flattedindex = flattedindex*a.shape[i] + indices[...,i]
    flattedshape = (-1,) + a.shape[indexrank:]
    return a.reshape(flattedshape).take(flattedindex)


- Lennart




On 4/5/06, Pau Gargallo<pau.gargallo at gmail.com> wrote:

hi,
i had the same problem and i defined a function with a similar sintax
to interp2 which i call take2 to solve it:

from numpy import *

def take2( a, x,y ):
        return take( ravel(a), x + y*a.shape[0] )

a = array( [[ 0.15,  0.75,  0.2 ],
                 [ 0.82,  0.5,   0.77],
                  [ 0.21,  0.91,  0.59]] )
xy = array([    [[1, 1], [1, 1], [2, 1]],
                [[2, 2], [0, 0], [1, 0]],
                [[1, 1], [0, 0], [2, 1]]] )

print take2( a, xy[...,0], xy[...,1] )

i hope this helps you.
pau




On 4/5/06, amcmorl <amcmorl at gmail.com> wrote:
> Hi all,
>
> I'm having a bit of trouble getting my head around numpy's indexing
> capabilities. A quick summary of the problem is that I want to
> lookup/index in nD from a second array of rank n+1, such that the last
> (or first, I guess) dimension contains the lookup co-ordinates for the
> value to extract from the first array. Here's a 2D (3,3) example:
>
> In [12]:print ar
> [[ 0.15  0.75  0.2 ]
>  [ 0.82  0.5   0.77]
>  [ 0.21  0.91  0.59]]
>
> In [24]:print inds
> [[[1 1]
>   [1 1]
>   [2 1]]
>
>  [[2 2]
>   [0 0]
>   [1 0]]
>
>  [[1 1]
>   [0 0]
>   [2 1]]]
>
> then somehow return the array (barring me making any row/column errors):
> In [26]: c = ar.somefancyindexingroutinehere(inds)
>
> In [26]:print c
> [[ 0.5  0.5  0.91]
>  [ 0.59 0.15 0.82]
>  [ 0.5  0.15 0.91]]
>
> i.e. c[x,y] = a[ inds[x,y,0], inds[x,y,1] ]
>
> Any suggestions? It looks like it should be relatively simple using
> 'put' or 'take' or 'fetch' or 'sit' or something like that, but I'm not
> getting it.
>
> While I'm here, can someone help me understand the rationale behind
> 'print' printing row, column (i.e. a[0,1] = 0.75 in the above example
> rather than x, y (=column, row; in which case 0.75 would be in the first
> column and second row), which seems to me to be more intuitive.
>
> I'm really enjoying getting into numpy - I can see it'll be
> simpler/faster coding than my previous environments, despite me not
> knowing my way at the moment, and that python has better opportunities
> for extensibility. So, many thanks for your great work.
> --
> Angus McMorland
> email a.mcmorland at auckland.ac.nz
> mobile +64-21-155-4906
>
> PhD Student, Neurophysiology / Multiphoton & Confocal Imaging
> Physiology, University of Auckland
> phone +64-9-3737-599 x89707
>
> Armourer, Auckland University Fencing
> Secretary, Fencing North Inc.
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by xPML, a groundbreaking scripting language
> that extends applications into web and mobile media. Attend the live webcast
> and join the prime developer group breaking into this new coding territory!
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/numpy-discussion
>





More information about the NumPy-Discussion mailing list