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.