Применение рекурсивной функции или цикла переменной длины к элементам массива numpy

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

У меня есть функция вида:

 def f(x):

    n = 0

    while x > basecase:
        x = g(x)
        n  = 1

    return n
  

По сути, он применяет функцию g() к x до тех пор, пока не будет выполнено условие, а затем возвращает, сколько приложений n потребовалось.

Я хотел бы иметь возможность вызывать эту функцию в массивах numpy, чтобы я мог составлять графики f(x) для большого диапазона x с помощью MatPlotLib. Но в нынешнем виде функция не работает — сравнение между x (массивом) и basecase (скаляром) является проблемой, как и тот факт, что n является единственным целым числом, а не массивом.

Я знаю, что мог бы просто вызвать vectorize , но это медленно — в основном то же самое, что выполнять итерации вручную. Что я могу здесь сделать? Существуют ли какие-либо функции numpy функционального программирования, которые могут спасти меня здесь, или мне пришлось бы переписывать вещи с помощью nditer , если бы я хотел избежать накладных расходов vectorize ?

Комментарии:

1. Вы можете переписать f () и g () с помощью Cython; в любом случае вам нужно будет добавить дополнительное условие, чтобы предотвратить бесконечный цикл. Примечание: итерационный процесс, который вы применяете к g (x), заключается в нахождении корня уравнения x = g(x) . В некоторых случаях этот итерационный процесс не будет сходиться (это зависит от g (x)).

2. nditer полезно только как ступенька к его использованию в cython . Если вам необходимо выполнить итерацию (в отличие от использования операций numpy для всего массива), работайте со списками.

3. Если x это массив, что бы while x>basecase означало? Все значения x больше целевого? Есть значения больше? while является скалярной операцией, да / нет. Вам нужно четко представлять, скорее себе, чем нам, что должно произойти.

4. @bubble g(x) известен, и процесс гарантированно сходится. Я просто не хотел включать это для простоты. @hpaulj Моя цель состоит в том, чтобы функция действовала точно так, как если бы вы передали ей каждый элемент по отдельности, поэтому она проверяет каждый элемент отдельно, и если тест завершается неудачей, она выполняет цикл. Я не уверен, возможно ли что-то подобное (потому что вам пришлось бы чередовать циклы python и C), вот почему я спрашиваю.

5. Таким образом, вы решаете не функцию массива, а скорее набор независимых значений. Другими словами, решение g для множества разных начальных значений.