interleaved indexing

A very beginner question about indexing: let x be an array where n = len(x). I would like to create a view y of x such that:
y[i] = x[i:i+m,...] for each i and a fixed m << n
so I can do things like numpy.cov(y). With n large, allocating y is a problem for me. Currently, I either do for loops in cython or translate operations into correlate() but am hoping there is an easier way, maybe using fancy indexing or broadcasting. Memory usage is secondary to speed, though.
Thanks.

Hi Amir
2008/7/18 Amir amirnntp@gmail.com:
A very beginner question about indexing: let x be an array where n = len(x). I would like to create a view y of x such that:
y[i] = x[i:i+m,...] for each i and a fixed m << n
so I can do things like numpy.cov(y). With n large, allocating y is a problem for me. Currently, I either do for loops in cython or translate operations into correlate() but am hoping there is an easier way, maybe using fancy indexing or broadcasting. Memory usage is secondary to speed, though.
Robert Kern's recently added numpy.lib.stride_tricks should help:
In [84]: x = np.arange(100).reshape(10,-1)
In [85]: x Out[85]: 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], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59], [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], [70, 71, 72, 73, 74, 75, 76, 77, 78, 79], [80, 81, 82, 83, 84, 85, 86, 87, 88, 89], [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
In [86]: x.stridesOut[86]: (40, 4)
In [87]: xx = np.lib.stride_tricks.as_strided(x, shape=(8, 3, 10), strides=(40, 40, 4))
In [88]: xx Out[88]: 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]],
[[10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]],
[[20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]],
[...]
Cheers Stéfan
participants (2)
-
Amir
-
Stéfan van der Walt