簡體   English   中英

從二維數組的元素創建 3D 數組

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

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