[Numpy-discussion] contiguous true
Charles R Harris
charlesr.harris at gmail.com
Sat Mar 1 01:12:56 EST 2008
On Fri, Feb 29, 2008 at 10:53 AM, John Hunter <jdh2358 at gmail.com> wrote:
> [apologies if this is a resend, my mail just flaked out]
>
> I have a boolean array and would like to find the lowest index "ind"
> where N contiguous elements are all True. Eg, if x is
>
> In [101]: x = np.random.rand(20)>.4
>
> In [102]: x
> Out[102]:
> array([False, True, True, False, False, True, True, False, False,
> True, False, True, False, True, True, True, False, True,
> False, True], dtype=bool)
>
> I would like to find ind=1 for N=2 and ind=13 for N=2. I assume with
> the right cumsum, diff and maybe repeat magic, this can be vectorized,
> but the proper incantation is escaping me.
>
> for N==3, I thought of
>
> In [110]: x = x.astype(int)
> In [112]: y = x[:-2] + x[1:-1] + x[2:]
>
> In [125]: ind = (y==3).nonzero()[0]
>
> In [126]: if len(ind): ind = ind[0]
>
> In [128]: ind
> Out[128]: 13
>
This may be more involved than you want, but
In [37]: prng = random.RandomState(1234567890)
In [38]: x = prng.random_sample(50) < 0.5
In [39]: y1 = concatenate(([False], x[:-1]))
In [40]: y2 = concatenate((x[1:], [False]))
In [41]: beg = ind[x & ~y1]
In [42]: end = ind[x & ~y2]
In [43]: cnt = end - beg + 1
In [44]: i = beg[cnt == 4]
In [45]: i
Out[45]: array([28])
In [46]: x
Out[46]:
array([False, False, False, False, True, False, True, False, False,
False, True, False, True, False, True, True, True, True,
True, False, False, False, True, False, True, False, False,
False, True, True, True, True, False, False, True, False,
False, False, False, False, False, False, False, True, False,
False, True, False, True, False], dtype=bool)
produces a list of the indices where sequences of length 4 begin.
Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20080229/265cf0f2/attachment.html>
More information about the NumPy-Discussion
mailing list