#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
для множества разных начальных значений.