Можно подумать о замене np.vstack()
, np.append()
и подобных на соответствующие операции list
и преобразовать окончательный результат в np.array()
в конце. Конечный результат может выглядеть примерно так:
def pad_groups_opt(dataset, groups):
dataset = np.array(dataset)
max_subtree_length = get_max_subtree_length(groups)
start = 0
rows, cols = dataset.shape
padded_dataset = []
for group in groups:
pad = [group[0]] + [0] * (cols - 1)
stop = start + group[1]
subtree = dataset[start:stop].tolist()
padded_dataset.extend(subtree)
subtree_to_pad = max_subtree_length - group[1]
pads = [pad] * subtree_to_pad
padded_dataset.extend(pads)
start = stop
return np.array(padded_dataset)
и тестирование его на соответствие вашему исходному коду:
dataset = np.array([
[1, 2, 3], [1, 2, 3], [1, 2, 3], [2, 2, 3], [2, 2, 3],
[2, 2, 3], [3, 2, 3], [3, 2, 3], [3, 2, 3], [4, 2, 3],
[4, 2, 3], [4, 2, 3], [5, 2, 3], [5, 2, 3], [5, 2, 3],
[6, 2, 3], [6, 2, 3], [6, 2, 3], [7, 2, 3], [7, 2, 3],
[7, 2, 3], [8, 2, 3], [8, 2, 3], [8, 2, 3]])
groups = [(1, 3), (2, 3), (3, 3), (4, 3), (5, 3), (6, 3), (7, 3), (8, 3)]
print(np.all(pad_groups(dataset, groups) == pad_groups_opt(dataset, groups)))
# True
По времени вы получаете ~ 2-кратное ускорение при вводе:
%timeit pad_groups(dataset, groups)
# 10000 loops, best of 3: 169 µs per loop
%timeit pad_groups_opt(dataset, groups)
# 10000 loops, best of 3: 89.3 µs per loop
и, кажется, становится еще лучше (~ 10x) для больших входов:
%timeit pad_groups(dataset.tolist() * 100, groups * 100)
# 10 loops, best of 3: 107 ms per loop
%timeit pad_groups_opt(dataset.tolist() * 100, groups * 100)
# 100 loops, best of 3: 9.21 ms per loop