Я хотел бы инициализировать массив b
, похожий на этот, но быстрее:
a = [0.53, 0.66, 0.064, 0.94, 0.44]
b = [0.0]*5
x = 14.3
for i in range(5):
x = b[i] = a[i]*0.1 + x*0.9
Есть ли что-то в numpy для этой цели?
3 ответа
Уродливое, но векторизованное решение
import numpy as np
a = np.array([0.53, 0.66, 0.064, 0.94, 0.44])
x = 14.3
idx = np.arange(a.size)
0.9 ** idx * (0.1 * (a * 0.9 ** (-idx)).cumsum() + x * 0.9)
# array([12.923 , 11.6967 , 10.53343 , 9.574087 , 8.6606783])
Результат из цикла for
:
a = [0.53, 0.66, 0.064, 0.94, 0.44]
b = [0.0]*5
x = 14.3
for i in range(5):
x = b[i] = a[i]*0.1 + x*0.9
b
#[12.923000000000002,
# 11.696700000000003,
# 10.533430000000003,
# 9.574087000000002,
# 8.660678300000002]
Это потому что:
И компоненты в результате могут быть векторизованы соответственно, обратите внимание, что сумма a
членов во внутренних скобках векторизована как cumsum
.
Давайте перепишем ваш цикл, чтобы проанализировать его более внимательно:
for i in range(1, 5):
b[i] = a[i]*0.1 + b[i-1]*0.9
Это дает понять, что расчет является рекурсивным. То есть значение b[i]
зависит от значения b[i-1]
. Это означает, что вы не можете векторизовать расчет. Векторизация требует, чтобы каждый элемент вектора результата был независим от всех других элементов.
Может быть, мы можем сломать и найти корреляцию между каждым шагом
***x0=x0***
***x1=a[0]*0.1 + x0*0.9***
***x2=a[1]*0.1 + x1*0.9=a[1]*0.1 + (a[0]*0.1 + x0*0.9)*0.9***
Так что xn=an*0.1+an-1*0.1*0.9+...+a0*0.1*0.9**n-1+x0*0.9**n
n=np.array(0.9)**np.arange(len(a))
sum(a[::-1]*n)*0.1+x*(0.9**(len(a)))
Out[338]: 8.6606783
Обновить вывод array
np.diag(np.fliplr(((a*n[::-1])*0.1).cumsum()/n[:,None]+x*(0.9**(np.arange(1,len(a)+1)))))[::-1]
Out[472]: array([12.923 , 11.6967 , 10.53343 , 9.574087 , 8.6606783])
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.