2024-06-11 20:06:24 发布
网友
我想将一个数组分割成等长的相交子数组(上一个数组的最后一个元素与下一个数组的第一个元素重合,并且具有周期性边界条件)
例如
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中实现这一点最有效的方法是什么
您可以使用skimage的^{}获取输入数组的重叠视图,并相应地连接最后一个窗口的前w-1项:
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]])
重叠的元素实际上是指同一个内存,所以请非常小心地使用此视图
您可以使用skimage的^{} 获取输入数组的重叠视图,并相应地连接最后一个窗口的前
w-1
项:^{} 的纯numpy等价物是^{} :
结果是:
重叠的元素实际上是指同一个内存,所以请非常小心地使用此视图
相关问题 更多 >
编程相关推荐