Numpy pad нули заданного размера

Я прочитал большинство связанных вопросов здесь, но я не могу понять, как использовать np.pad в этом случае. Может быть, это не предназначено для этой конкретной проблемы.

Допустим, у меня есть список массивов Numpy. Каждый массив имеет одинаковую длину, например 2. Сам список должен быть дополнен, например, до 5 массивов, и его также можно преобразовать в простой массив. Дополненные элементы должны быть массивами, заполненными нулями. В качестве примера

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)

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

Идея состоит в том, чтобы создать массив нулей, а затем заполнить первые строки значениями из входного списка.

Кажется, вы хотите заполнить нулями в конце оси 0, говоря в numpy термины. Итак, что вам нужно,

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

Хитрость pad_width параметр, который нужно указать как pad_width=((0,2),(0,0)) чтобы получить ожидаемый результат. Это ты говоришь pad() вставить отступы 0 в начале и отступы 2 в конце оси 0 и вставить отступы 0 в начале и отступы 0 в конце оси 1. Формат pad_width является ((before_1, after_1), … (before_N, after_N)) согласно документации

mode='constant' говорит pad() дополнить значением, указанным параметром constant_values который по умолчанию равен 0.

Другие вопросы по тегам