0

Using numpy's nditer, is it possible to manually handle dimensions with different lengths?

For example, lets say I had an array A[5, 100] and I wanted to sample every 10 along the second axis so I would end up with an array B[5,10]. Is it possible to do this with nditer, handling the iteration over the second axis manually of course (probably in cython)?

Another way to ask this would be, is it possible to ask nditer to allow me to manually iterate over a set of dimensions I provide?

I want to be able to do something like this (modified from this example)

@cython.boundscheck(False)
def sum_squares_cy(arr):
    cdef np.ndarray[double] x
    cdef np.ndarray[double] y
    cdef int size
    cdef double value
    cdef int j

    axeslist = list(arr.shape)
    axeslist[1] = -1

    out = zeros((arr.shape[0], 10))
    it = np.nditer([arr, out], flags=['reduce_ok', 'external_loop',
                                      'buffered', 'delay_bufalloc'],
                op_flags=[['readonly'], ['readwrite', 'no_broadcast']],
                op_axes=[None, axeslist],
                op_dtypes=['float64', 'float64'])
    it.operands[1][...] = 0
    it.reset()
    for xarr, yarr in it:
        x = xarr
        y = yarr
        size = x.shape[0]
        j = 0
        for i in range(size):
           #some magic here involving indexing into x[i] and y[j]
    return it.operands[1]

Does this make sense? Is it possible to do?

John Salvatier
  • 3,077
  • 4
  • 26
  • 31
  • Strides... http://stackoverflow.com/questions/4923617/efficient-numpy-2d-array-construction-from-1d-array – Benjamin Oct 03 '11 at 13:46

1 Answers1

0
a = numpy.arange(500.0).reshape((5,100))
numpy.lib.stride_tricks.as_strided(a, (5,10), (6400,64))
Benjamin
  • 11,560
  • 13
  • 70
  • 119