Olivier Guibé - LMRS, fortement inspiré d'un document de Pierre Navaro (IRMAR).
ndarray
multi-dimensionnelfrom numpy import *
import
explicites plt
pour matplotlib.pyplot
np
pour numpy
sp
pour scipy
import numpy as np
print(np.__version__)
Il y a de l'aide en anglais
#np.nd<TAB>
print(np.eye.__doc__)
ndarray
class.¶ndarray
)a = np.array([0,1,2,3]) # liste
b = np.array((4,5,6,7)) # tuple
c = np.matrix('8 9 0 1') # string (à la matlab)
print(a,b,c)
a*b,a+b
5*a, 5+a
a@b, np.dot(a,b) # produit scalaire
a = np.array([1,2,3,4,5], dtype=float) # création avec type flottant
type(a) # le type
a.dtype # le type des éléments
a.shape # retourne un tuple des dimensions selon les axes
np.size(a), a.size # le nombre d'éléments
a.ndim # la dimension
shape
ousize
pour les ndarray
plutôt que len
len
retourne le nombre d'éléments de la liste (donc en 2D le nombre de lignes)b=np.array([[1, 2, 4],[6,7,8]], dtype=float)
print(b)
print("len ", len(b),"; size ", np.size(b),"; size(axis=1)", np.size(b,axis=1),"; size(axis=0)",
np.size(b,axis=0), "; shape ", np.shape(b))
x = np.zeros((2,),dtype=float)
x
les commandes empty, empty_like, ones, ones_like, zeros, zeros_like, full, full_like
n = 5
a = np.zeros(n*n,dtype=np.double).reshape(n,n) # 1D nxn reshaper en 2d n x n !
b = np.zeros((n,n),dtype=np.double)
a == b
a = np.array([1,2,3,4,5])
print(a.dtype)
a[0] = 10
a, a.dtype
a.fill(0) # plus rapide que a[:] = 0
a
début
est inclus mais fin
n'est pas inclus (tout le monde fait l'erreur)a = np.array([10,11,12,13,14])
a[:2], a[-5:-3], a[0:2], a[-2:] # avec des indices négatifs
a[::2], a[::-1]
def trap(f,a,b,n):
xpt=np.linspace(a,b,n+1)
return (b-a)/n*(np.sum(f(xpt[1:-1]))+.5*(f(a)+f(b)))
def f(x):
return x
print(trap(f,0,1,10))
def f(x):
return np.sin(x)
print(trap(f,0,np.pi,50))
a = np.arange(4*3).reshape(4,3) # NumPy array
l = [[0,1,2],[3,4,5],[6,7,8],[9,10,11]] # liste Python
print(a)
print(l)
l[-1][-1] # [i][j] est fastidieux
print(a[-1,-1]) # avec Numpy
print(a[0,0]) # le 1er élément
print(a[1,:]) # la seconde ligne
print(a[:,1]) # la seconde colonne
print(a[1]) # 2ème ligne avec 2d array
print(a[:,-1]) # dernière colonne
b=a[2:5]
puis b[0]=5
) change le tableau original (donc a
)a = np.arange(10)
b = a[3:6]
b # est une vue de `a`
b[0] = -1
a # changer la vue change a
c = a[7:8].copy() # une copie explicite SVP, merci
c[0] = -1
a
a>1
)matrix
¶C'est un type spécifique 2D qui possède certains opérateurs spécifiques comme $*$ (multiplication matricielle) et $**$ (élévation à la puissance). Personnellement je ne l'utilise pas...
m = np.matrix('1 2; 3 4') #à la Matlab
m
a = np.matrix([[1, 2],[ 3, 4]]) #à la Python
a
a = np.arange(1,4)
b = np.mat(a) # pas de copie !
b, np.may_share_memory(a,b)
a = np.matrix([[1, 2, 3],[ 3, 4, 5]])
a * b.T # produit matrice x vecteur
m * a # multiplication matricielle
import numpy.random as rd
print(rd.rand(1)) # un seul
print(rd.rand(4)) # un np.array 1D
print(rd.rand(4,5)) # un np.array 2D
Des entiers aléatoires dans $[m,M]$ (inclus)
print(rd.randint(-10,5))
print(rd.randint(-5,5,4)) #vecteur taille 4
print(20*np.eye(10)+rd.randint(-10,10,(10,10))) # une matrice à coefficients entiers aléatoires
#et à diagonale strictement dominante (normalement)
print(rd.randint(-10,10,(2,2,2)))
Pour générer suivant la loi normale $\mathcal{N}(3,8)$ (merci de ne pas poser de question):
8**.5 * rd.randn(2, 4) + 3
Calculer l'aire de la réunion des disques $D_1$ (centre $(.5,.5)$ rayon $1/3$) et $D_2$ (centre $(.2,.5)$ rayon $.1$)
# méthode naïve
N , p = 10000, 0
A, B = np.array([.5,.5]), np.array([.2,.5])
for i in range(N):
x= rd.rand(2)
if (x-A)@(x-A)<=1/9 or (x-B)@(x-B)<=.01:
p=p+1
print(p/N)
Faire une version moins naïve, vectorisée...
# version vectorisée
# Bonus : tracé
import matplotlib.pyplot as plt
N = 100000
A, B = np.array([.5,.5]), np.array([.2,.5])
M = rd.rand(N,2)
MD1 = ((M[:,0]-A[0])**2+(M[:,1]-A[1])**2)<1/9
MD2 = ((M[:,0]-B[0])**2+(M[:,1]-B[1])**2)<.01
Munion = MD1 + MD2 # ici on vérifie qu'avec Numpy np.array([True])+np.array([True])=np.array([True])
# car en Python True + True = 2
print(sum(Munion)/N)
plt.rcParams['figure.figsize'] = (10.0, 10.0) # figure plus grande
plt.scatter(M[np.nonzero(Munion)][:,0],M[np.nonzero(Munion)][:,1])
plt.scatter(M[np.nonzero(Munion-1)][:,0],M[np.nonzero(Munion-1)][:,1])
plt.show()
Évidemment, Numpy sait générer les lois binomiales, exponentielles, Dirichlet, géométrique, multinomiales, de Poisson (merci de ne poser aucune question)
mu, sigma = 0, 0.1
s = np.random.normal(mu, sigma, 1000)
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10.0, 6.0)
count, bins, ignored = plt.hist(s, 30, normed=True)
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (bins - mu)**2 / (2 * sigma**2) ), linewidth=2, color='r')
plt.show();
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.