Numpy pad нули заданного размера - PullRequest
0 голосов
/ 11 февраля 2019

Я прочитал большинство связанных вопросов здесь, но я не могу понять, как использовать 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 ]

0 голосов
/ 11 февраля 2019

Похоже, вы хотите заполнить нулями в конце оси 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.

0 голосов
/ 11 февраля 2019

Вы можете переписать свою функцию следующим образом:

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

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

...