[英]Create 3D array from elements of a 2D array
我正在編寫代碼,一個問題突然出現在我的腦海中。 所以基本上我有一個 2D numpy 數組,形狀為L,W = (4, 4)
(這只是一個例子,數組可以更大)。
我需要的是使用二維 numpy 數組中的元素創建 3D 數組,其中 output 的每個單元格中的元素是: array[i:i+l, j:j+w]
(維度子數組的元素 ( l,w) 從 i,j 位置開始): output[i,j,:] = array[i:i+l,j:j+w].reshape(l*w,)
我想到了非矢量化解決方案:
import numpy as np
L = 4
W = 4
array = np.arange(16).reshape(L,W)
l= 2
w = 2
subarrays_elements = []
for i in range(L-(l-1)):
for j in range(W-(w-1)):
subarrays_elements.append(array[i:i+l,j:j+w].reshape(l*w,))
output = np.array(subarrays_elements).reshape(L-(l-1),W-(w-1),l*w)
output 的形狀是W-(w-1),L-(l-1),l*w
,因為我們無法得到最后l-1
行和w-1
的 (l, w) 子數組w-1
列。
預期的 output 將是包含 (3,3,4) 的數組:
expected_output = np.array([[[0 1 4 5],
[1 2 5 6],
[2 3 6 7]],
[[4 5 8 9],
[5 6 9 10],
[6 7 10 11]],
[[8 9 12 13],
[9 10 13 14],
[10 11 14 15]]])
我需要僅使用 numpy 和矢量化的解決方案,因為我有一個巨大的數組,所以任何幫助將不勝感激,謝謝!
這種問題與在 neural.network 中獲取卷積層的輸入非常相似,因此您可以使用相同的工具,即numpy.lib.stride_tricks.sliding_window_view 。
這是一個例子:
import numpy as np
from numpy.lib.stride_tricks import sliding_window_view
L = 4
W = 4
array = np.arange(L * W).reshape(L,W)
l = 2
w = 2
new_length = L-(l-1)
new_width = W-(w-1)
output = sliding_window_view(array, window_shape=[l, w]).reshape(new_length, new_width, l*w)
理論上,滑動 window 應該幾乎不需要時間,因為它只是操縱數組步幅而不是復制數據,但在這種情況下,重塑會強制它制作數組的完整副本。 在我的計算機上,它在大型 arrays 上以每秒大約 5000 萬個數組元素的速度運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.