0

我在这里阅读了大多数相关问题,但我似乎无法弄清楚如何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)
4

2 回答 2

1

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

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

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

于 2019-02-11T12:56:42.550 回答
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 个填充和在轴 1 的末尾插入 0 个填充。格式pad_width((before_1, after_1), … (before_N, after_N))根据文档

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

于 2019-02-11T13:39:04.653 回答