Python将数组拆分为相交的子数组

2024-06-11 20:06:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将一个数组分割成等长的相交子数组(上一个数组的最后一个元素与下一个数组的第一个元素重合,并且具有周期性边界条件)

例如

myarray = np.arange(18)

输出:

splitarray = [[0,1,2,3,4],[4,5,6,7,8],[8,9,10,11,12],[12,13,14,15,16],[16,17,0,1,2]]

(最后一个子阵列的最后3个元素对应于初始阵列的前3个元素!)

在Python中实现这一点最有效的方法是什么


Tags: 方法元素np数组周期性边界条件arangemyarray
2条回答

您可以使用skimage的^{}获取输入数组的重叠视图,并相应地连接最后一个窗口的前w-1项:

from skimage.util import view_as_windows

def view_strided_with_roll(a, w):
    a = np.r_[a, a[:w-1]]
    return view_as_windows(a, window_shape=w, step=w-1)

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

^{}的纯numpy等价物是^{}

arr = np.arange(18)
w = 5

if arr.size == 1:
    h = 1
    x = 4
else:
    h = np.ceil((arr.size - 1) / (w - 1)).astype(int)
    x = (1 - arr.size) % (w - 1)

view = np.lib.stride_tricks.as_strided(np.r_[arr, arr[:x]], shape=(h, w), strides=((w - 1) * arr.strides[0], arr.strides[0]))

结果是:

>>> view
array([[ 0,  1,  2,  3,  4],
       [ 4,  5,  6,  7,  8],
       [ 8,  9, 10, 11, 12],
       [12, 13, 14, 15, 16],
       [16, 17,  0,  1,  2]])

重叠的元素实际上是指同一个内存,所以请非常小心地使用此视图

相关问题 更多 >