簡體   English   中英

如何在 NP arrays 數組中填充第三維?

[英]How to pad a 3rd dimention in an array of NP arrays?

我想用零填充數組的第三維,這是我嘗試的:

import numpy as np

arr = [np.array([[1,2,3], [1,2,3]]), np.array([[1,2],[2,3,4, 5]])]
lar =  []
for r in arr: 
    for e in r:
        lar.append(len(e))
        
i = max(lar)
for (ii, r) in enumerate(arr): 
    for (i, e) in enumerate(r):
       print(i)
       print(e)
       arr[ii][i]= np.pad(e, (0,i), 'constant' ) 
print(i)
print(lar)
print(arr)

然而,一旦它必須調整第一個子數組,它就會失敗,期望的結果:

[[[1,2,3,0]
[1,2,3,0]],
[[1,2,0,0],
[2,3,4,5]]]

讓我們從Numpy支持鋸齒狀 arrays (任何維度的長度不同)的注釋開始。

另一個需要提及的細節是,您的源“數組”( arr )實際上不是任何數組,而是Numpy arrays 的列表

此列表的每個元素是:

  • 要么是“常規”二維Numpy數組(如果每個維度中的所有大小都相同),
  • 或一維數組,包含列表(不同大小),整個元素是object類型的數組。

因此,解決問題的正確方法是根據每行的類型執行兩種不同的填充方式。

編寫以下 function:

def myPad(arr):
    lar =  []
    for r in arr: 
        for e in r:
            lar.append(len(e))
    n = max(lar)
    rv = []
    for row in arr:
        if row.ndim == 1:  # A jagged array (1-D array of lists (of different lengths))
            rv.append(np.array([ col + [0] * (n - len(col)) for col in row ]))
        else:              # 2-D array (all rows of same length)
            rv.append(np.pad(row, ((0, 0), (0, n - row.shape[1]))))
    return np.array(rv)

它從您的代碼開始確定目標大小( n )。

然后是一個循環,處理每一行,根據當前行的維數用一個“fork”( if );

  • 如果path 處理“鋸齒狀”數組的情況,
  • else path 處理“常規”數組的情況。

你打電話時:

result = myPad(arr)

對於您的源數據,結果是:

array([[[1, 2, 3, 0],
        [1, 2, 3, 0]],
       [[1, 2, 0, 0],
        [2, 3, 4, 5]]])

它的形狀( result.shape )是:

(2, 2, 4)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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