I have numpy array and I want to use power series like taylor series of e^x
, and I am wondering how to implement this in python. For the simplicity purpose, I think I can use maclaurin series at x0=0
, wheres x
is numpy array. Basically, I have 1 dim pixel vector, and I want to non-linearly expand each pixel value by using taylor series expansion of e^x. In other words, in output vector, each pixel will be replaced with first and second term of taylor series expansion term. Any idea to make this happen in python?
mathematical concept:
here is the simple math concept I want to accomplish, wheres nunmpy array is expected to be non-linearly expanded by using power series like maclaurin series of e^x
.
my attempt:
import numpy as np
arr= np.array([[120.0,24.0,12.0],[14.0,28.0,43.0]])
arr= arr/255.0
def maclurin_exp(x, power):
res = x*0
for i in range(power):
res += x**i/math.factorial(i)
return res
## test my code:
maclurin_exp(x=arr, power=3)
new update 2:
Precisely, F
is taylor series of e^x
, x
is each pixel value, x0
is approximation point at 0. For example if we have 8 pixel in 1 dim vector, then after we used taylor series of e^x for each pixel value, first and second term of taylor expansion will be considered as ouput.
how do I make this happen in python? any workaround to accomplish the implementation of Maclaurin series for e^x
in more compact way? any thought?
expected output
for example we have 1 dim pixel vector [1,2,3,4,5,6,7,8]
, then we apply above mathematical equation to approximate each pixel value by using maclurin series of e^x:
pixel = [1,2,3,4,5,6,7,8]
then first and second term of taylor series of e^x for each pixel value would be my final output.
The Maclaurin Series of e x : ∑ n=0∞ x n n ! Maclaurin Series. Taylor series of function f ( x ) at a is defined as : f ( x )= f ( a )+ f ′( a )1!
By the updated definition, it could be something like this:
def exp_taylor(x, x0=0, n_terms=2):
f_a = np.exp(x0)
terms = [f_a * ((x-x0)**i)/np.math.factorial(i) for i in range(n_terms)]
return np.dstack(terms).ravel()
Following the fact that the expansion of e^(x)
around a
is e^(a) + e^(a)(x-a) + e^(a)(x-a)^2/2!
and so on. The combination of dstack
and ravel
then interleaves the terms into a single vector. So if you have [np.array([a0,b0,c0]), np.array([a1,b1,c1])]
, it'll combine them to np.array([a0,a1,b0,b1,c0,c1])
.
x = np.array([1, 1, 2, 3, 5, 8, 13, 21])
x_ = exp_taylor(x, x0=1, n_terms=3)
print(x_)
>>>
[ 2.71828183 0. 0. 2.71828183 0.
0. 2.71828183 2.71828183 1.35914091 2.71828183
5.43656366 5.43656366 2.71828183 10.87312731 21.74625463
2.71828183 19.0279728 66.5979048 2.71828183 32.61938194
195.71629165 2.71828183 54.36563657 543.65636569]
import numpy as np
import math
def maclurin_exp(x, power):
res = np.zeros_like(x)
for i in range(power):
res += x ** i / np.float(math.factorial(i))
return res
def maclurin_test():
arr = np.array([[120.0, 24.0, 12.0], [14.0, 28.0, 43.0]])
arr = arr / 255.0
# arr = np.array([0, 1, 2], dtype=np.float)
power = 10
mc_result = maclurin_exp(arr, power)
exp_result = np.exp(arr)
diff = np.abs(mc_result - exp_result)
return diff
if __name__ == "__main__":
print(maclurin_test())
output:
[[1.53308255e-10 2.22044605e-16 2.22044605e-16] [4.44089210e-16 2.22044605e-16 5.32907052e-15]]
meaning small non zero diff Your main problem was not casting the factorial, thus resulting in integer division.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With