Применить функцию к массиву, где один из факторов функции зависит от индекса строки массива - PullRequest
0 голосов
/ 28 февраля 2019

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

a = value_function(arr, beta=beta_adj(beta, T = i), alpha = alpha/i)

, где value_function - это функция, которую необходимо применить к массиву arr для создания массива целиа.

Бета-версия является входной функцией value_function и определяется другой функцией с именем beta_adj, которая принимает два значения в качестве входных данных (бета и T).

beta_adj(beta, T = i)

Т-фактор должен бытьравно номеру строки массива arr (я там, чтобы указать, что).

То же самое должно быть сделано для альфа-фактора, где альфа будет делиться на номер строки (я снова там, чтобы указать номер строки).

alpha = alpha / i

Есть ли способчтобы повысить эффективность времени и избежать использования цикла for для итерации по каждой из строк массива (см. пример, реализованный ниже)?

for i in range(len(arr)):
    if i == 0:
        a = value_function(arr[0], beta=beta_adj(beta, T = i), alpha = alpha/i )
    else:
        a = np.concatenate((a, np.matrix(value_function(arr[i], beta=beta_adj(beta, T = i), alpha = alpha/i)))), axis = 0)

1 Ответ

0 голосов
/ 05 марта 2019

В цикле for в настоящее время первая итерация создает a, а последующие итерации объединяют от matrix до a.Каждая такая конкатенация является дорогостоящей операцией, а повторная конкатенация - определенно плохая идея

Не создавать и не объединять в a внутри цикла for.

Опция 1:

Inцикл for, просто продолжайте накапливать list ссылок на matrix объектов, возвращаемых value_function.После выхода из цикла for просто наберите от one call до numpy.concatenate(), передав список объектов матрицы в качестве первого аргумента.

Опция 2:

Если точные размеры (число элементов) возвращаемых матричных объектов известны заранее (до цикла for), используйте эти числа для предварительного создания массива a (до цикла for), inего полный размер , но без какой-либо инициализации.Для этого вы можете использовать numpy.empty().

Затем внутри цикла for использовать каждый матричный объект для выполнения назначений соответствующим частям этого полноразмерного массива a.Опять же, мы избегаем повторной конкатенации, поэтому это определенно ускорит процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...