【问题标题】:Numpy pad zeroes of given size给定大小的 Numpy 填充零
【发布时间】:2019-07-04 23:24:36
【问题描述】:

我在这里阅读了大多数相关问题,但我似乎无法弄清楚在这种情况下如何使用np.pad。也许它不适用于这个特定的问题。

假设我有一个 Numpy 数组列表。每个数组的长度相同,例如2.列表本身必须被填充为例如5个数组,也可以转换成一个numpy数组。填充的元素应该是用零填充的数组。举个例子

arr = [array([0, 1]), array([1, 0]), array([1, 1])]
expected_output = array([array([0, 1]), array([1, 0]), array([1, 1]), array([0, 0]), array([0, 0])])

以下似乎可行,但我觉得必须有更好,更有效的方法。实际上,这是运行数十万甚至数百万次,因此速度很重要。也许是np.pad

import numpy as np

def pad_array(l, item_size, pad_size=5):
  s = len(l)

  if s < pad_size:
    zeros = np.zeros(item_size)
    for _ in range(pad_size-s):
      # not sure if I need a `copy` of zeros here?
      l.append(zeros)

  return np.array(l)

B = [np.array([0,1]), np.array([1,0]), np.array([1,1])]
AB = pad_array(B, 2)

print(AB)

【问题讨论】:

  • 输出不只是一个二维数组吗?
  • @DanielMesejo 是的。 (形状 1xn。)我不知道为什么这很重要,也不知道为什么你删除了你的答案,因为这看起来很好。 (尽管它可以使用更多的解释。)
  • pad_size小于输入列表的长度怎么办?
  • 实际上这不可能发生,因为 pad_size 是从输入数据派生的。所以在这种情况下,只需返回 np.array 变体。
  • 你使用item_size参数是为了什么?如果所有数组的大小相同,您可以摆脱它,只使用第一个数组的长度,如zeros = np.zeros(len(l[0])) 这里。

标签: python arrays numpy zero-padding


【解决方案1】:

您似乎想在轴 0 的末尾填充零,用numpy 术语来说。所以你需要的是,

output = numpy.pad(arr, ((0,2),(0,0)), 'constant')

诀窍是pad_width 参数,您需要将其指定为pad_width=((0,2),(0,0)) 以获得预期的输出。这是你告诉pad() 在轴 0 的开头插入 0 个填充,在轴 0 的末尾插入 2 个填充,并在轴 1 的开头插入 0 个填充,在轴的末尾插入 0 个填充。pad_width 的格式根据documentation((before_1, after_1), … (before_N, after_N))

mode='constant' 告诉pad() 填充参数constant_values 指定的值,默认为0。

【讨论】:

    【解决方案2】:

    你可以像这样重写你的函数:

    import numpy as np
    
    
    def pad_array(l, item_size, pad_size=5):
    
        if pad_size < len(l):
            return np.array(l)
    
        s = len(l)
        res = np.zeros((pad_size, item_size))  # create an array of (item_size, pad_size)
        res[:s] = l  # set the first rows equal to the elements of l
    
        return res
    
    
    B = [np.array([0, 1]), np.array([1, 0]), np.array([1, 1])]
    AB = pad_array(B, 2)
    
    print(AB)
    

    输出

    [[0. 1.]
     [1. 0.]
     [1. 1.]
     [0. 0.]
     [0. 0.]]
    

    这个想法是创建一个零数组,然后用输入列表中的值填充第一行。

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 2016-11-06
      • 1970-01-01
      • 2018-10-05
      • 2017-10-24
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2016-10-07
      相关资源
      最近更新 更多