To create an efficient compression algorithm
import matplotlib.pyplot as plt
import numpy as np
import math
def one_dimensional_wavelet_compression(x, y, epsilon):
x_keep, y_keep = [], []
# Appending First Points
x_keep.append(x[0])
y_keep.append(y[0])
x_keep.append(x[1])
y_keep.append(y[1])
x_even, y_even = [], []
x_odd, y_odd = [], []
for i in range(len(x)):
if i % 2 == 0:
x_even.append(x[i])
y_even.append(y[i])
else:
x_odd.append(x[i])
y_odd.append(y[i])
x_even_mid, y_even_mid = [], []
x_odd_mid, y_odd_mid = [], []
for j in range(len(x_even) - 1):
# Calculating Even Mid-Points
slope_even = (y_even[j + 1] - y_even[j]) / (x_even[j + 1] - x_even[j])
x_even_mid.append(((x_even[j + 1] - x_even[j]) / 2) + x_even[j])
y_even_mid.append(slope_even * ((x_even[j + 1] - x_even[j]) / 2) + y_even[j])
# Calculating Odd Mid-Points
slope_odd = (y_odd[j + 1] - y_odd[j]) / (x_odd[j + 1] - x_odd[j])
x_odd_mid.append(((x_odd[j + 1] - x_odd[j]) / 2) + x_odd[j])
y_odd_mid.append(slope_odd * ((x_odd[j + 1] - x_odd[j]) / 2) + y_odd[j])
sig_figs = 7
x = list_round(x, sig_figs)
x_odd = list_round(x_odd, sig_figs)
x_even_mid = list_round(x_even_mid, sig_figs)
x_even = list_round(x_odd, sig_figs)
x_odd_mid = list_round(x_even_mid, sig_figs)
for k in range(len(x_even_mid)):
index1 = x.index(x_even_mid[k])
index2 = x.index(x_odd_mid[k])
delta1 = y[index1] - y_even_mid[k]
delta2 = y[index2] - y_odd_mid[k]
if abs(delta1) > epsilon:
x_keep.append(x[index1])
y_keep.append(y[index1])
if abs(delta2) > epsilon:
x_keep.append(x[index2])
y_keep.append(y[index2])
# Appending End Points
x_keep.append(x[len(x) - 2])
y_keep.append(y[len(x) - 2])
x_keep.append(x[len(x) - 1])
y_keep.append(y[len(x) - 1])
return x_keep, y_keep
def initial_data():
# Defining Actual Function
x = np.arange(0., math.pi, 0.01)
y = []
[(y.append(math.exp(math.sin(xi ** 2)) - math.cos(xi))) for xi in x]
# Defining Test Points
x_tp = np.arange(0., math.pi, math.pi / 24)
y_tp = []
[(y_tp.append(math.exp(math.sin(x_tpi ** 2)) - math.cos(x_tpi))) for x_tpi in x_tp]
return x_tp, y_tp
def list_round(list, sf):
rounded = []
for l in list:
rounded.append(round(l, sf))
return rounded
x, y = initial_data()
epsilon = 0.25
x_keep, y_keep = one_dimensional_wavelet_compression(x, y, epsilon)
plt.figure('1D Wavelet Compression')
plt.plot(x_keep, y_keep, 'bo--', markersize=12)
plt.plot(x, y, 'yo--', markersize=6)
plt.legend(['key points', 'original points'])
plt.show()
Epsilon = 0.025
Epsilon = 0.05
Epsilon = 0.1
Epsilon = 0.2
Epsilon = 0.3