我想从一个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
来重新创建大量新的临时元素数组,这将是无效的。
如何更有效地做同样的事情?
答案 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])
等等。