nditer: можно ли вручную обрабатывать размеры различной длины? - PullRequest
0 голосов
/ 30 сентября 2011

Используя numpy's nditer , можно ли вручную обрабатывать размеры с разными длина

Например, допустим, у меня был массив A [5, 100], и я хотел выбрать каждый 10 вдоль второй оси, поэтому я получу массив B [5,10]. Это можно сделать это с помощью nditer, обрабатывая итерацию по второй оси вручную, конечно (вероятно, в Cython)?

Еще один способ задать этот вопрос: можно ли попросить nditer разрешить мне вручную выполнить итерации по предоставленному мною размеру?

Я хочу иметь возможность сделать что-то подобное (изменено из этого примера )

@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]

Имеет ли это смысл? Можно ли это сделать?

1 Ответ

0 голосов
/ 03 октября 2011
a = numpy.arange(500.0).reshape((5,100))
numpy.lib.stride_tricks.as_strided(a, (5,10), (6400,64))
...