nditer:可以手动处理不同长度的尺寸吗?

时间:2011-09-30 15:27:56

标签: python numpy cython

使用numpy的nditer,是否可以手动处理不同的维度 长度?

例如,假设我有一个数组A [5,100],我想要每个样本 10沿着第二轴,所以我最终得到一个数组B [5,10]。是吗 可以用nditer执行此操作,处理第二轴上的迭代 当然是手动(可能在cython中)?

另一种问这个问题的方法是,是否可以让nditer允许我手动迭代我提供的一组维度?

我希望能够做到这样的事情(从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]

这有意义吗?有可能吗?

1 个答案:

答案 0 :(得分:0)

a = numpy.arange(500.0).reshape((5,100))
numpy.lib.stride_tricks.as_strided(a, (5,10), (6400,64))