[PYTHON] Fonctions mathématiques trouvées dans Scipy

En regardant en arrière sur 2015, je voudrais résumer les fonctions mathématiques que j'ai trouvées dans scipy.

scipy.stats.dirichlet C'est une fonction de la distribution Diricle utilisée dans LDA et ainsi de suite.

import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
import matplotlib.tri as tri

alphas = np.array([3.0, 4.0, 5.0])
dc = ss.dirichlet(alphas)

corners = np.array([[0.0, 0.0], [1.0, 0.0], [0.5, np.sqrt(3.0) / 2.0]])
midpoints = [(corners[(i + 1) % 3] + corners[(i + 2) % 3]) / 2.0 for i in range(3)]

def xy2bc(xy):
    s = [(corners[i] - midpoints[i]).dot(xy - midpoints[i]) / 0.75 for i in range(3)]
    return np.clip(s, 0.0, 1.0)
refiner = tri.UniformTriRefiner(tri.Triangulation(corners[:, 0], corners[:, 1]))
trimesh = refiner.refine_triangulation(subdiv=8)
pvals = [dc.pdf(xy2bc(xy)) for xy in zip(trimesh.x, trimesh.y)]
plt.tricontourf(trimesh, pvals, 200)
plt.axis('equal')
plt.show()

dilichlet.png

scipy.stats.wishert, scipy.stats.invwishert C'est aussi la distribution de Wishart et la distribution inverse de Wishart qui sont parfois utilisées dans MCMC. L'exemple suivant générera 10 nombres aléatoires pour chacune des matrices distribuées bidimensionnelles.

import numpy as np
import scipy.stats as ss

w = ss.wishart(df=3, scale=np.matrix([[1.0, 0.5], [0.5, 1.0]]))
print w.rvs(10)
iw = ss.invwishart(df=3, scale=np.matrix([[1.0, 0.5], [0.5, 1.0]]))
print iw.rvs(10)

scipy.special.comb, scipy.special.perm Calcul de séquence et de combinaison.

>>> import scipy.special as ss
>>> ss.comb(6, 3) # 6C3
20.0
>>> ss.perm(6, 3) # 6P3
120.0

scipy.optimize.rosen Fonction Rosenblock utilisée dans le cadre de l'optimisation.

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt

from scipy.optimize import rosen
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y = np.meshgrid(np.arange(-3., 3., 0.1), np.arange(-3., 3., 0.1))
Z = [[rosen((x, y)) for x, y in zip(xx, yy)] for xx, yy in zip(X, Y)]
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
plt.show()

rosen.png

scipy.signal.lti C'est un invariant de temps linéaire qui est pris en charge dans l'ingénierie de contrôle. Dans l'exemple ci-dessous, un système invariant dans le temps linéaire est créé et son diagramme de carte est dessiné.

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# 1 / s^2 + 0.1s + 1
s = signal.lti([1], [1.0, 0.1, 1.0])
w, mag, phase = signal.bode(s, np.arange(0.1, 5.0, 0.01).tolist())

fig, (ax0, ax1) = plt.subplots(nrows=2, sharex=True)
ax0.semilogx(w, mag, 'b-')
ax0.set_ylabel("Magnitude")
ax1.semilogx(w, phase, 'r-')
ax1.set_ylabel("Phase")
plt.show()

lti_bode.png

scipy.spatial.KDTree C'est un arbre KD de l'algorithme de division spatiale. Dans l'exemple ci-dessous, les points sont dispersés dans une grille dans un espace tridimensionnel, et tous les points situés dans une plage de distance de 1,0 à partir des points (20, 20, 20) sont extraits.

import numpy as np
import scipy.spatial as ss                                      

x, y, z= np.mgrid[0:100, 0:100, 0:100]
points = zip(x.ravel(), y.ravel(), z.ravel())
tree = ss.KDTree(points)
a = tree.query_ball_point([20, 20, 20], 1.0)
print [points[i] for i in a]
[(19, 20, 20), (20, 19, 20), (20, 20, 19), (20, 20, 20), (20, 20, 21), (20, 21, 20), (21, 20, 20)]

scipy.cluster.vq.kmeans2 La méthode de k-moyennage pour les algorithmes de clustering.

import numpy
from scipy.cluster.vq import kmeans2, whiten

features = numpy.array([[ 1.9,2.3],
                        [ 1.5,2.5],
                        [ 0.8,0.6],
                        [ 0.4,1.8],
                        [ 0.1,0.1],
                        [ 0.2,1.8],
                        [ 2.0,0.5],
                        [ 0.3,1.5],
                        [ 1.0,1.0]])
wf = whiten(features)  #Normalisation
print kmeans2(wf, k=2)

Vous obtiendrez une étiquette pour le centre et chaque valeur.

(array([[ 1.40584568,  0.69587293],
       [ 1.24002799,  2.50514254]]), array([1, 1, 0, 1, 0, 1, 0, 1, 0]))

scipy.constants.g Ce n'est pas une fonction, mais c'est une accélération gravitationnelle. Divers autres paramètres physiques sont définis.

>>> import scipy.constants
>>> scipy.constants.g
9.80665

scipy.ndimage.gaussian_filter Un algorithme de filtre utilisé dans le traitement d'image.

import scipy
from scipy import ndimage
import matplotlib.pyplot as plt

img = scipy.misc.lena().astype(float)
fimg = ndimage.gaussian_filter(img, 3)

plt.figure(figsize=(8, 4))
plt.subplot(121)
plt.imshow(img, cmap=plt.cm.gray)
plt.subplot(122)
plt.imshow(fimg, cmap=plt.cm.gray)
plt.show()

lena.png

Résumé

scipy implémente diverses fonctions et algorithmes dans divers domaines, et c'est amusant de simplement regarder la référence. Je vous serai également redevable l’année prochaine.

Recommended Posts

Fonctions mathématiques trouvées dans Scipy
Mettez scipy dans ec2
Gestion des matrices clairsemées dans Scipy
Remplacer les fonctions de bibliothèque en Python
Fonctions Python apprises avec la chimioinfomatique
Y a-t-il un spécial dans scipy? ??
Utilisation de variables globales dans les fonctions python