首页 > 解决方案 > 如何在 NP 数组中填充第三维?

问题描述

我想用零填充数组的第三维,这是我尝试的:

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]]]

标签: pythonarraysnumpypadding

解决方案


让我们Numpy不支持锯齿状数组(在任何维度上具有不同长度)的评论开始。

另一个要提到的细节是,您的源“数组”(arr)实际上不是任何数组,而是Numpy数组的列表

此列表的每个元素是:

  • 要么是“常规”二维Numpy数组(如果每个维度的所有大小都相同),
  • 或一维数组,包含列表(不同大小),整个元素是对象类型的数组。

因此,解决问题的正确方法是根据每行的类型执行两种不同的填充方式。

编写以下函数:

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)

推荐阅读