[SciPy-User] Can I get the "rings" of a 2D array?

josef.pktd at gmail.com josef.pktd at gmail.com
Mon Apr 12 23:19:02 EDT 2010


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


>
> Jeremy
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>



More information about the SciPy-User mailing list