2012-02-21 3 views
4

Я хочу создать массив в numpy, который содержит значения математической серии, в этом примере квадрат предыдущего значения, дающий одно начальное значение, то есть a_0 = 2, a_1 = 4, a_3 = 16, .. .Как использовать numpy для вычисления серии эффективно?

Попытка использовать векторизации в NumPy я думал, что это может работать:

import numpy as np 
a = np.array([2,0,0,0,0]) 
a[1:] = a[0:-1]**2 

но результат

array([2, 4, 0, 0, 0]) 

я узнал теперь, что NumPy делает внутренне создать временный массив для вывода и в конце копий этот массив, поэтому он терпит неудачу для значений, которые равны нулю в исходном массиве. Есть ли способ для векторизации этой функции с помощью numpy, numexpr или других инструментов? Какие еще существуют способы эффективного вычисления значений серии, когда доступны быстрые функции numpy без перехода в цикл for?

+0

также связано: http://stackoverflow.com/questions/4407984/is-a-for-loop-necessary-if-elements- of-the-a-numpy-vector-are-depend-on-t – sdaau

ответ

6

Нет общего способа векторизации определений рекурсивных последовательностей в NumPy. Этот частный случай довольно легко писать без для цикла, хотя:

>>> 2 ** 2 ** numpy.arange(5) 
array([ 2,  4, 16, 256, 65536]) 
+0

Спасибо. Это не тот ответ, на который я надеялся, но теперь я могу начать переписывать свою проблему, чтобы избежать рекурсивного определения. – Alexander

Смежные вопросы