提取比numpy数组大小更大的切片

时间:2014-03-18 14:38:18

标签: python arrays numpy

我想从一个numpy数组A中提取一个长度为10的切片,从索引2开始:

import numpy 

A = numpy.array([1,3,5,3,9])

def bigslice(A, begin_at, length):
    a = A[begin_at:begin_at + length]
    while len(a) + len(A) < length:
        a = numpy.concatenate((a,A))
    return numpy.concatenate((a, A[:length-len(a)]))

print bigslice(A, begin_at = 2, length = 10)
#[5,3,9,1,3,5,3,9,1,3]

这是对的。但是我正在寻找一种更有效的方法来实现这一点(特别是当我最后会有数千个元素的数组)时:我怀疑这里使用concatenate来重新创建大量新的临时元素数组,这将是无效的。

如何更有效地做同样的事情?

2 个答案:

答案 0 :(得分:3)

由于数组的中间部分已为您所知(即重复完整数组),您可以使用np.tile构建中间部分:

def cyclical_slice(A, start, length):
    arr_l = len(A)
    middle = np.tile(A, length // arr_l)

    return np.array([A[start:], middle, A[0:length - len(middle)]])

答案 1 :(得分:2)

您的代码似乎并不能保证您得到一片length,例如

>>> A = numpy.array([1,3,5,3,9])
>>> bigslice(A, 0, 3)
array([1, 3, 5, 3, 9, 1, 3, 5])

假设这是疏忽,也许你可以使用np.pad,例如

def wpad(A, begin_at, length):
    to_pad = max(length + begin_at - len(A), 0)
    return np.pad(A, (0, to_pad), mode='wrap')[begin_at:begin_at+length]

给出了

>>> wpad(A, 0, 3)
array([1, 3, 5])
>>> wpad(A, 0, 10)
array([1, 3, 5, 3, 9, 1, 3, 5, 3, 9])
>>> wpad(A, 2, 10)
array([5, 3, 9, 1, 3, 5, 3, 9, 1, 3])

等等。