On Fri, Sep 30, 2011 at 8:03 AM, John Salvatier wrote:
Using 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)?

I want something like this (modified from http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#putting-the-inner-loop-in-cython)

@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_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?

I'm not sure I understand precisely what you're asking. Maybe you could reshape A to have shape [5, 10, 10], so that one of those 10's can match up with the 10 in B, perhaps with the op_axes?

-Mark

_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion