如何从numpy数组中提取居中窗口?

bybem2ql  于 2023-04-06  发布在  其他
关注(0)|答案(3)|浏览(126)

假设我有下面的numpy数组:

>>> a = np.arange(0,21,1)
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

现在假设我想选择一个长度为N的窗口,其中2 < N <= a.shape[0],使得窗口以数组a中的一个元素为中心。例如,如果我想以数组a中的元素10为中心设置一个长度为N = 5的窗口,那么这个窗口将是:

>>> idx = 10 # index of the array element 10
>>> N = 5 # window size
>>> a[idx - N//2:idx + N//2 + 1]
array([ 8,  9, 10, 11, 12])

这个方法可以很好地推广到不在数组边缘附近的窗口,但是我不能让它工作。例如,如果我想在a中的元素2周围提取一个长度为N = 7的窗口,那么我得到的是:

>>> idx = 2
>>> N = 7
>>> a[idx - N//2:idx + N//2 + 1]
array([], dtype=int32)

但是我想要的是:

>>> a[0:7]
array([0, 1, 2, 3, 4, 5, 6])

如何将此方法推广到a边缘附近的窗口?

0x6upsns

0x6upsns1#

尝试:

idx = 2
start = min(idx - N//2, 0)
a[start:start + N]

注意,这不是以idx=2为中心。

xbp102n0

xbp102n02#

基于Quang Hoang's answer,以下是工作原理:

import numpy as np

a = np.arange(0,21,1)
idx = 5 # desired element index
N = 7 # window length

if N % 2: # if window length is odd
    step = N // 2
else: # if window length is even
    step = int(N/2 - 1)

# make sure starting index is between 0 and a.shape[0] - N
start = min(max(idx-step,0),a.shape[0] - N)
window = a[start:start + N]
ckocjqey

ckocjqey3#

如果是一个小数组,使用take和wrap,在一行中更易读:

>>>a.take(range(idx - N//2, idx + N//2 + 1), mode="wrap")
array([20,  0,  1,  2,  3,  4,  5])

如果它很大,性能可能是一个问题,您可以使用视图,请参阅:Numpy子数组和相对索引。

相关问题