Я пытаюсь найти способ для векторизации операции, в которой я беру 1 массив numpy и разворачиваю каждый элемент на 4 новые точки. Я сейчас делаю это с петлей Python. Сначала позвольте мне объяснить алгоритм.Векторизовать расширение массива numpy
input_array = numpy.array([1, 2, 3, 4])
Я хочу «развернуть» или «расширить» каждый элемент в этом массиве до 4 точек. Таким образом, элемент ноль (значение 1) будет расширено до этих 4-й точек:
[0, 1, 1, 0]
Это случилось бы для каждого элемента, чтобы в конечном итоге с окончательным массивом:
[0, 1, 1, 0, 0, 2, 2, 0, 0, 3, 3, 0, 0, 4, 4, 0]
я хотел бы сделайте код немного общим, чтобы я мог также выполнить это «расширение» по-другому. Например:
input_array = numpy.array([1, 2, 3, 4])
На этот раз каждая точка расширяется путем добавления + = .2 к каждой точке. Итак, окончательный массив будет:
[.8, .8, 1.2, 1.2, 1.8, 1.8, 2.2, 2.2, 2.8, 2.8, 3.2, 3.2, 3.8, 3.8, 4.2, 4.2]
Код, который я использую в настоящее время, выглядит следующим образом. Это довольно наивный подход, который работает, но кажется, что было бы способ ускорить его для больших массивов:
output = []
for x in input_array:
output.append(expandPoint(x))
output = numpy.concatenate(output)
def expandPoint(x):
return numpy.array([0, x, x, 0])
def expandPointAlternativeStyle(x):
return numpy.array([x - .2, x - .2, x + .2, x + .2])
А, я никогда не думал об использовании умножения и дополнения. Теперь кажется очевидным, что я это вижу. Благодаря! –
Этот подход и подход 'ufunc' с« внешним »кажутся эквивалентными, но я пойду с этим, поскольку он был первым. Я тестировал оба, и они кажутся одинаковыми с точки зрения производительности. –