Python/Numpy-将切片环绕在数组的末尾

Python/Numpy-将切片环绕在数组的末尾,python,indexing,numpy,slice,Python,Indexing,Numpy,Slice,我有两个1D数组,一个有一些感兴趣的值(a),另一个为该数组(b)提供索引。我知道b中的值总是增加的,除了在某个点(可能是任何地方),因为它从数组a的末尾滚动到开头,所以这个数字会减少。下面的方法似乎有效,但我认为必须存在一种更干净的方法。有人能提出更好的建议吗?谢谢 代码: 将numpy导入为np a=np.arange(12) b=np.数组([5,9,2,4]) #我想生成这些: #[5,6,7,8,9] #[9,10,11,0,1,2] #[2,3,4] #[4,5] a=np.滚动(a

我有两个1D数组,一个有一些感兴趣的值(a),另一个为该数组(b)提供索引。我知道b中的值总是增加的,除了在某个点(可能是任何地方),因为它从数组a的末尾滚动到开头,所以这个数字会减少。下面的方法似乎有效,但我认为必须存在一种更干净的方法。有人能提出更好的建议吗?谢谢

代码:

将numpy导入为np
a=np.arange(12)
b=np.数组([5,9,2,4])
#我想生成这些:
#[5,6,7,8,9]
#[9,10,11,0,1,2]
#[2,3,4]
#[4,5]
a=np.滚动(a,-b[0],轴=0)
#减去b[0],但确保所有值均为正值
b=(b-b[0]+len(a))%len(a)
对于枚举(b)中的i,ind:
如果i
稍微短一点,但也许我还能做得更好

import numpy as np

a = np.arange(12)
b = np.array([5, 9, 2, 4])
b = np.append(b, b[0])

for i in range(0, len(b)-1):
    print np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1]

不确定这是否有帮助,但一种不干扰
a
内存的快速方法是:

import numpy as np

a = np.arange(12)
b = np.array([5, 9, 2, 4])
b = np.append(b, b[0])

b2 = b.copy()

b2[(np.diff(b)<0).nonzero()[0]+1:] += a.size

print [np.take(a, np.r_[b2[i]:b2[i+1]+1], mode='wrap') for i in range(b.size-1)]

print [np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1] for i in range(b.size-1)]

%timeit [np.take(a, np.r_[b2[i]:b2[i+1]+1], mode='wrap') for i in range(b.size-1)]
# 10000 loops, best of 3: 28.6 µs per loop

%timeit [np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1] for i in range(b.size-1)]
# 10000 loops, best of 3: 77.7 µs per loop
将numpy导入为np
a=np.arange(12)
b=np.数组([5,9,2,4])
b=np.append(b,b[0])
b2=b.复制()

b2[(np.diff(b)您可以通过使用:
np.roll(a,-b[i])[:b[i+1]-b[i]+1]
谢谢,这更干净。虽然它可能会有更多的roll函数调用,我认为这可能会降低非常大的数组的速度。您是否可以考虑在不使用roll的情况下执行此操作?替换
np.roll(…
仅使用
a[b[i]:b[i+1]+1]
的行将适用于除发生滚动的情况之外的所有情况。您可以将整个数组a附加到自身,并重新计算
a[start:end]的索引
,但我认为这会更复杂,而不是更少。我确信有一种方法可以用步幅来实现这一点,只是还没有时间尝试……我想也可以用步幅来实现。尽管我对他们不太了解。如果我有时间,我会尝试更多地调查他们。
import numpy as np

a = np.arange(12)
b = np.array([5, 9, 2, 4])
b = np.append(b, b[0])

b2 = b.copy()

b2[(np.diff(b)<0).nonzero()[0]+1:] += a.size

print [np.take(a, np.r_[b2[i]:b2[i+1]+1], mode='wrap') for i in range(b.size-1)]

print [np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1] for i in range(b.size-1)]

%timeit [np.take(a, np.r_[b2[i]:b2[i+1]+1], mode='wrap') for i in range(b.size-1)]
# 10000 loops, best of 3: 28.6 µs per loop

%timeit [np.roll(a, len(a)-b[i])[:b[i+1]-b[i]+1] for i in range(b.size-1)]
# 10000 loops, best of 3: 77.7 µs per loop