[SciPy-User] Can I get the "rings" of a 2D array?
Jeremy Conlin
jlconlin at gmail.com
Mon Apr 12 23:35:55 EDT 2010
On Mon, Apr 12, 2010 at 9:19 PM, <josef.pktd at gmail.com> wrote:
> On Mon, Apr 12, 2010 at 10:23 PM, Jeremy Conlin <jlconlin at gmail.com> wrote:
>> On Mon, Apr 12, 2010 at 5:16 PM, Charles R Harris
>> <charlesr.harris at gmail.com> wrote:
>>>
>>>
>>> On Mon, Apr 12, 2010 at 4:55 PM, Jeremy Conlin <jlconlin at gmail.com> wrote:
>>>>
>>>> I need to get the "rings" of a 2D array; i.e. the first ring would be
>>>> the first and last column in addition to the first and last row, the
>>>> second ring would be the second and second-from-last row and the
>>>> second and second-from-last column---except for what is not in the
>>>> first ring. Is there a way to slice an array to get this data?
>>>>
>>>
>>> So will the rings be different sizes or all the same size with the other
>>> elements zeroed?
>>
>> Good question. The better option would be to keep the size of the
>> array the same and zero all the other elements.
>
> The following seems to work for building the index arrays for the rings,
> tested on only 2 examples
>
>
> import numpy as np
> a = np.arange(30).reshape(6,5)
> n = np.array(a.shape)
> from collections import defaultdict
> rings = defaultdict(list)
> for i in np.ndindex(*n):
> #print i,
> imin = min(i)
> imax = min(n-i-1)
> #print imin,imax
> rings[min(imin,imax)].append(i)
>
> for r in rings:
> print r
> print a[np.array(rings[r])[:,0],np.array(rings[r])[:,1]]
>
>
> 0
> [ 0 1 2 3 4 5 9 10 14 15 19 20 24 25 26 27 28 29]
> 1
> [ 6 7 8 11 13 16 18 21 22 23]
> 2
> [12 17]
>>>> a
> array([[ 0, 1, 2, 3, 4],
> [ 5, 6, 7, 8, 9],
> [10, 11, 12, 13, 14],
> [15, 16, 17, 18, 19],
> [20, 21, 22, 23, 24],
> [25, 26, 27, 28, 29]])
>
> Josef
>
Thanks. I just might be able to put that to work.
Jeremy
More information about the SciPy-User
mailing list