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([[[1],
[3]],
[[5],
[7]]])
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
this work". It won't necessarily help your situation, but it's a handy
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 :)
More information about the Python-list
mailing list