NumPy:   "numerical Python", runs in C Matplotlib:   visualization
     
#!/usr/bin/env python3
import numpy as np               # for numerics
import matplotlib.pyplot as plt  # for plotting
class globalData:      # variables are static when not declared with 'self'
 dimX = 2              # x-dimension
 dimY = 3              # y-dimension
 dimZ = 2              # y-dimension
print("*******************")
print("global data example")
print("*******************")
yxArray = np.ones( (globalData.dimY, globalData.dimX) )
zyArray = np.ones( (globalData.dimZ, globalData.dimY) )
print('yxArray :\n',yxArray)
print('zyArray :\n',zyArray)
print('zy * yx :\n',np.matmul(zyArray,yxArray))       # matrix multiplication
print("****************")
print("plotting example")
print("****************")
nPoints = 400
xPoints = range(nPoints)
yPoints = [np.sin(0.01*np.pi*x) for x in xPoints]
plt.plot(xPoints, yPoints)
plt.show()
subplots(nrows=1, ncols=1,...)
     ============================================= character description ============================================= '-' solid line style '--' dashed line style '-.' dash-dot line style ':' dotted line style '.' point marker ',' pixel marker 'o' circle marker 'v' triangle_down marker '^' triangle_up marker '<' triangle_left marker '>' triangle_right marker '1' tri_down marker '2' tri_up marker '3' tri_left marker '4' tri_right marker 's' square marker 'p' pentagon marker '*' star marker 'h' hexagon1 marker 'H' hexagon2 marker '+' plus marker 'x' x marker 'D' diamond marker 'd' thin_diamond marker '|' vline marker '_' hline marker
================== character color ================== 'b' blue 'g' green 'r' red 'c' cyan 'm' magenta 'y' yellow 'k' black 'w' white
#!/usr/bin/env python3
# importing matplotlib module
from matplotlib import pyplot as plt
from matplotlib.ticker import AutoMinorLocator
# equivalent import
# import matplotlib.pyplot as plt
 
# x-axis values
x = [5, 2, 9, 4, 7]
 
# Y-axis values
y = [10, 5, 8, 4, 2]
xMin, xMax, yMin, yMax = 2, 9, 2, 10
xTicks = range(xMin-1, xMax+2, 1)
yTicks = range(yMin  , yMax+1, 2)
 
# create figure / axis object
# quadratic outlay with figsize()
# subplots(nrows=1, ncols=1,...)
_, myAxis = plt.subplots(figsize=(10,10))
# sline are the axis / border
myAxis.spines['right'].set_linewidth(0.0)
myAxis.spines['top'].set_linewidth(0.0)
myAxis.spines['bottom'].set_linewidth(4.0)
myAxis.spines['left'].set_linewidth(4.0)
# axis start/end/labels
myAxis.axis([xMin, xMax, yMin, yMax])
myAxis.set_title('boring diagram', fontweight="bold", size=16)
myAxis.set_xlabel('x-label', fontsize = 16)
myAxis.set_ylabel('y-label', fontsize = 16) 
# major ticks by default
# minor ticks need to be activated
myAxis.tick_params(width=2, length=8, labelsize=12)
myAxis.xaxis.set_minor_locator(AutoMinorLocator())
myAxis.tick_params(which='minor', length=8, width=2, color='r')
# location of ticks
plt.setp(myAxis, xticks=xTicks, yticks=yTicks)
# plotting 
line, points = myAxis.plot(x, y, "--g",            # line
               x, y, "ob")             # points
# activate line lebel box
line.set_label('my line')
points.set_label('my points')
myAxis.legend(loc='upper center', fontsize='larger')
 
plt.show()
matplotlib.animation.FuncAnimation() 
     animation by recurrent function calling
     numpy.dtype   data type objects
#!/usr/bin/env python3
# source
# https://matplotlib.org/stable/gallery/animation/rain.html
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
# fixing random state for reproducibility
np.random.seed(19680801)
# create new Figure and an Axes which fills it
fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(0, 1), ax.set_xticks([])
ax.set_ylim(0, 1), ax.set_yticks([])
# rain drops as an array of specified data type ´dtype'
n_drops = 50
rain_drops = np.zeros(n_drops, dtype=[('position', float, (2,)),
                                      ('size',     float),
                                      ('growth',   float),
                                      ('color',    float, (4,))])
# random initial raindrops 
rain_drops['position'] = np.random.uniform(0, 1, (n_drops, 2))
rain_drops['growth'] = np.random.uniform(50, 200, n_drops)
# scatter plot, will be updated during animation
scat = ax.scatter(rain_drops['position'][:, 0], rain_drops['position'][:, 1],
                  s=rain_drops['size'], lw=0.5, edgecolors=rain_drops['color'],
                  facecolors='none')
#
# -- the update function
#
def update(frame_number):
# get an index which we can use to re-spawn the oldest raindrop
    current_index = frame_number % n_drops
# make all colors more transparent as time progresses
    rain_drops['color'][:, 3] -= 1.0/len(rain_drops)
    rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)
# make circles bigger
    rain_drops['size'] += rain_drops['growth']
# pick a new position for oldest rain drop, 
# resetting its size
    rain_drops['position'][current_index] = np.random.uniform(0, 1, 2)
    rain_drops['size'][current_index] = 5
    rain_drops['color'][current_index] = (0, 0, 0, 1)
    rain_drops['growth'][current_index] = np.random.uniform(50, 200)
# update the scatter collection, with the new colors, sizes and positions
    scat.set_edgecolors(rain_drops['color'])
    scat.set_sizes(rain_drops['size'])
    scat.set_offsets(rain_drops['position'])
#
# --- animation, with the update function as the animation director
#
animation = FuncAnimation(fig, update, interval=10, save_count=100)
plt.show()
#!/usr/bin/env python3
import numpy as np
import math
import matplotlib.pyplot as plt
# global parameters
nData = 2000                     # number of training pairs
nIter = 2000                     # number training iterations
nPar  =    4                     # number of fit parameters
learning_rate = 0.5e-2/nData     # relative learning rate
fitPar = []                      # empty list; fit parameters
for i in range(nPar):
  fitPar.append(np.random.randn())  
print(fitPar)
# fitting fuction
def fitFunction(x):
  sum = 0.0
  for i in range(nPar):
    sum += fitPar[i]*(x**i)
  return sum
# linespace returns a list
# training data: y= sin(x)
x = np.linspace(-math.pi, math.pi, nData)
y = np.sin(x)
# training iteration 
for iIter in range(nIter):
  y_pred = fitFunction(x)                  # list; element-wise
  loss = np.square(y_pred - y).sum()       # sum of squared elements
  if iIter % 100 == 99:                    # test printou
    print(f'{iIter:5d}  {loss:10.6f}')
  grad_y_pred = 2.0 * (y_pred - y)         # error signal
  for i in range(nPar):
    gradient = ( grad_y_pred*(x**i) ).sum()
    fitPar[i] -= learning_rate * gradient
# showing result
plt.plot(x, np.sin(x)                , 'b', label="sin(x)")
plt.plot(x, fitFunction(x)           , 'r', label="fit")
plt.plot(x, 0.0*x                    , '--k')
plt.legend()
plt.show()
#!/usr/bin/env python3
import numpy as np
x = np.array([0, 0, 1, 1, 2, 2])
y = np.array([8, 7, 6, 5, 3, 2])
z = np.array([[0, 6],
              [1, 7],
              [2, 8],
              [3, 9]])
print("\nx[:3]    ", x[:3])                # first 3 elements
print("\ny[] %    ", y[int(0.8*len(y)):])  # last 20%
print("\ny[::2]   ", y[::2])               # every second entry
print("\nx!=0     ", x!=0)                 # boolean array
print("\ny[x!=0]  ", y[x!=0])              # filtering
print("\n****************************")
print(z)
print("\nz[:,0]   ", z[:,0])               # only for np arrays
print("\nz[:,1]   ", z[:,1])
numpy.sqrt(numpy.sum(numpy.square(numPyArray)))
      numpy.linalg.norm(numPyArray) 
     numpy.sqrt(aa) = aa**2
       shortcut numpy.arange()  
#!/usr/bin/env python3
import time           # time in seconds
import numpy as np    # NumPy
NN = int(1e7)         # summing NN squares
#
# --- plain Python implementation
#
start_time = time.time()
result_plain = sum([i**2 for i in range(1, NN+1)])
end_time = time.time()
print(f"plain python, result: {result_plain:20.12e}")
print(f"plain python, time  : {end_time - start_time:7.3f}  seconds")
print()
#
# --- NumPy implementation
#
start_time = time.time()
result_numPy = \
  np.sum(np.arange(1, NN+1, dtype=np.float64)**2, dtype=np.float64)
end_time = time.time()
print(f"NumPy,        result: {result_numPy:20.12e}")
print(f"NumPy,        time  : {end_time - start_time:7.3f}  seconds")
| scipy.io | file input/output | 
| scipy.special | special functions | 
| scipy.linalg | linerar algebra | 
| scipy.interpolate | interpolations | 
| scipy.optimize | optimization and fitting | 
| scipy.stats | statistics and random numbers | 
| scipy.integrate | numerical integration | 
| scipy.fftpack | fast fourier transform | 
| scipy.signal | signal processing | 
| scipy.ndimage | image manipulation | 
#!/usr/bin/env python3
from scipy import linalg
import numpy as np
#square matrix
squareMatrix = np.array([ [5,4], [1,2] ])
print()
print("original / transposed matrix")
print(squareMatrix)
print(squareMatrix.T)
print()
#pass values to det() function
print("determinant    ", linalg.det(squareMatrix))
print()
# inverse 
print("inverse / inverse*matrix")
print(linalg.inv(squareMatrix))
print(squareMatrix.dot(linalg.inv(squareMatrix)))     # matrix multiplication
print()
#eigenvalues and vectors (as complex numbers)
print("eigenvalues | vectors")
eigenValues, eigenVectors = linalg.eig(squareMatrix)  # returning both
for ii in range(N:=len(eigenValues)):
  print(f'{ii:3d}  {np.real(eigenValues[ii]):7.4f} | ', end="")
  for jj in range(N):
    print(f'  {np.real(eigenVectors[ii][jj]):7.4f}', end="")
  print()
import datetime
print("date   today    : ", datetime.date.today())
from datetime import date
print("date   today    : ", date.today())
#!/usr/bin/env python3
import os                       # operating system
import math                     # nomen est omen
import random                   # idem
import statistics
from datetime import date
print(os.getcwd())              # current working directory
os.system('ls')                 # execute 'ls' command
if  1==2 :
  os.system('mkdir myDir')      # execute 'mkdir'
  os.chdir('myDir')             # change working directory
  os.system('cp ../test.py .')  # copy
  os.system('./test.py')        # run script (yourself again)
print()
print("math   cos      : ", math.cos(math.pi/4)*math.sqrt(2.0))
print("math   log      : ", math.log(1024, 2))
print()
print("random choice   : ", random.choice(['apple', 'pear', 'banana']))
print("random sample   : ", random.sample(range(100), 4))
print("random random   : ", random.random())
print()
data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
print("stat   mean     : ", statistics.mean(data))
print("stat   variance : ", statistics.variance(data))
| namedtuple() | tuples with named fields | 
| deque | two-headed list-like container with appends and pops on either end | 
| ChainMap | dictionary-like class for creating a single view of multiple mappings | 
| Counter | dictionary subclass for counting hashable objects | 
| OrderedDict | dictionary subclass that remembers the order entries were added | 
| defaultdict | dict subclass that allows to supply missing values | 
| UserDict | wrapper around dictionary objects for easier dict subclassing | 
| UserList | wrapper around list objects for easier list subclassing | 
| UserString | wrapper around string objects for easier string subclassing | 
jupyter notebook   after installation
     virtualenv  projectDir                make one 
     source      projectDir/bin/activate   activate 
     pip install jupyter                   install, inside
     pip install matplotlib                if used, etc. 
     jupyter     notebook                  run notebook 
     for i in range(n:=5): n = n-1 print(print(i,n)) # output?