[英]Python split array into intersecting subarrays
我想將一個數組拆分成同樣長的相交子數組(前一個數組的最后一個元素與下一個數組的第一個元素重合,並且具有周期性邊界條件)。
例如
myarray = np.arange(18)
output:
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 中實現這個最有效的方法是什么?
np.lib.stride_tricks.as_strided
ski.util.view_as_windows
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]])
重疊的元素實際上指的是同一個 memory,因此請非常非常小心地使用此視圖。
您可以使用 skimage 的view_as_windows
獲取輸入數組的重疊視圖,並相應地為最后一個 window 連接第一個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]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.