【问题标题】:How to pad a 3rd dimention in an array of NP arrays?如何在 NP 数组中填充第三维?
【发布时间】:2021-07-26 10:07:44
【问题描述】:

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

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

【问题讨论】:

    标签: python arrays numpy padding


    【解决方案1】:

    让我们从 Numpy 确实 支持锯齿状数组(具有不同的 长度)。

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

    这个列表的每个元素是:

    • “常规”二维 Numpy 数组(如果所有大小在 每个维度),
    • 或一维数组,包含列表(不同大小)和整个 element 是一个 object 类型的数组。

    所以解决问题的正确方法是执行填充 2 种不同的方式, 根据每一行的类型。

    编写如下函数:

    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 路径处理“常规”数组的情况。

    当你打电话时:

    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)
    

    【讨论】:

      猜你喜欢
      • 2014-01-27
      • 1970-01-01
      • 2018-01-27
      • 2022-01-19
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多