簡體   English   中英

Python 將數組拆分為相交的子數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM