# How to dynamically access Numeric subarrays

Christopher T King squirrel at WPI.EDU
Tue Aug 3 15:43:40 CEST 2004

```On Tue, 3 Aug 2004, Gaubitzer Erwin wrote:

> So my questions to out there:
> How can I extract a (Numeric Python) subarray whose indices
> have to be built dynamically.

The Numeric function take() might meet your needs:

>>> from Numeric import *
>>> a = array([[[1,2],[3,4]],[[5,6],[7,8]]])
>>> take(a,(0,),0)
array([       [[1, 2],
[3, 4]]])
>>> take(a,(1,),0)
array([       [[5, 6],
[7, 8]]])
>>> take(a,(0,),1)
array([[        [1, 2]],
[        [5, 6]]])
>>> take(a,(0,),2)
array([[,
],
[,
]])

The second argument specifies which indices to take, and the third
argument specifies to which dimension to apply the indices.

Note that take() returns an array of the same rank as that of its input;
this may not be what you want.  To obtain an array of one less dimension,
you'll need to reshape it.  A function like the following may be helpful:

def takeslice(a,index,dimension):
r = take(a,(index,),dimension)
s = shape(r)
return reshape(r,s[:dimension]+s[dimension+1:])

This will only accept single indexes to slice, rather than a tuple, but
will return you an array of rank N-1 from that which it is passed:

>>> takeslice(a,0,0)
array([[1, 2],
[3, 4]])
>>> takeslice(a,1,0)
array([[5, 6],
[7, 8]])
>>> takeslice(a,0,1)
array([[1, 2],
[5, 6]])
>>> takeslice(a,0,2)
array([[1, 3],
[5, 7]])

Also of tangential interest is the ... operator.  This magic operator,
given to a slice, means "replace me with however many : are needed to make
thing to know:

>>> a[0,...]
array([[1, 2],
[3, 4]])
>>> a[1,...]
array([[5, 6],
[7, 8]])
>>> a[...,0]
array([[1, 3],
[5, 7]])

Hope this helps, and is understandable :)

```