代码之家  ›  专栏  ›  技术社区  ›  Bram Vanroy

给定大小的numpy pad zeroes

  •  0
  • Bram Vanroy  · 技术社区  · 5 年前

    我在这里读过大多数相关的问题,但我似乎不知道如何使用 np.pad 在这种情况下。也许这不是针对这个特定的问题。

    假设我有一个麻木数组的列表。每个数组的长度相同,例如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-焊盘 ?

    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)
    
    2 回复  |  直到 5 年前
        1
  •  1
  •   Dani Mesejo    5 年前

    您可以这样重新编写函数:

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

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

        2
  •  0
  •   Teshan Shanuka J    5 年前

    好像你想在0轴的末尾加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填充,在轴1的结尾处插入0填充。格式 栅栏宽度 ((before_1, after_1), … (before_N, after_N)) 根据 documentation

    mode='constant' 讲述 () 用参数指定的值填充 constant_values 默认为0。