Main

Retour vers le tutoriel complet

Boucles et conditions

Syntaxe des boucles

La syntaxe est la suivante: pas d'accolade, pas de syntaxe ouvrante/fermante seulement de l'INDENTATION

Exemple simple sur un vecteur

v = np.arange(0,10) # [0, ... , 9]
for i in v:         # pour i allant de 0 à 9
    print(i," ", i*2)

Exemple avancé sur une matrice (ie un vecteur de vecteur)

m1=np.random.rand(4,5) # matrice(!)
for row in m1:      # pour chaque ligne de m1
                    # row est donc une ligne = array 1D
    print("row", row)

    for element in row:
        print(element)

Boucles imbriquées pour la création d'une liste:

a = [n for n in range(10)]

# plus compliqué
A = np.array([[n+m*10 for n in range(5)] for m in range(5)])
 #array([[ 0,  1,  2,  3,  4],
 #       [10, 11, 12, 13, 14],
 #       [20, 21, 22, 23, 24],
 #       [30, 31, 32, 33, 34],
 #       [40, 41, 42, 43, 44]])

# a block from the original array
A[1:4, 1:4]
 #array([[11, 12, 13],
 #       [21, 22, 23],
 #       [31, 32, 33]])

# sauts
A[::2, ::2]
 #array([[ 0,  2,  4],
 #      [20, 22, 24],
 #      [40, 42, 44]])

Le while existe également:

i=10
while i>0:
    print i
    i -= 1
# 10 9 8... 1 (un chiffre par ligne)

Boucles avancées

enumerate

Pour passer en revue les éléments d'une liste en ayant accès à leur indice:

v = np.random.rand(10)
# solution 1:
for i in range(len(v)):
    print('indice ',i, ' et valeur associée ', v[i])
# solution 2: (très utile dans les listes de compréhension)
for ind,val in enumerate(v):
    print('indice ',ind, ' et valeur associée ', val)

zip

Pour passer en revue les éléments de deux listes en même temps

v0 =np.arange(10)
v1 = np.random.rand(10)

for val0, val1 in zip(v0, v1):
    print('indice ',val0, ' et valeur associée ', val1)

Clauses

La syntaxe du IF est la suivante:

i=0
if i<30:
    i = i + 10;
    print("i est inferieur a trente")
else:                                 # le else est optionnel
    print("i est superieur a trente")

Pour les tests multiples, il existe une commande très pratique: elif

i=0
if i==1:
    print("cas 1")
elif i==2:
    print("cas 2")

Opérateurs logiques

Pour les clauses plus complexes, voici la liste des opérateurs logiques:

Opérations booléennes en anglais and, not, or

True and False
# False
not False
# True
True or False
# True

Comparaisons >, <, >= (plus grand ou égal), <= (inférieur ou égal), == equalité, != différent

Très classique...

Egalité référentielle entre objet

# objets identiques?
l1 = l2 = [1,2]
# ou bien
l1 = [1,2]
l2 = l1

print(l1 is l2) # True

# ou bien
l1 = [1,2]
l2 = [1,2]

print(l1 is l2) # False

Tests en bloc sur des matrices

Comment tester que toutes les valeurs d'une matrice sont supérieures à un seuil... Ou que l'une des valeurs dépasse ce seuil:

m = np.array([[1, 2], [3, 4]])

if (m>1).all():
    print("(1) sup to 1")
else:
    print("(1) NOT sup to 1")

if (m>1).any():
    print("(2) sup to 1")
else:
    print("(2) NOT sup to 1")

Application des boucles et conditionnelles

Générer une matrice M 10x10 avec les caractéristiques suivantes (i désigne les lignes et j les colonnes):

  • si (i+j) pair alors M(i,j) est un nombre aléatoire pair tiré entre 0 et 100
  • si (i+j) impair alors M(i,j) = i+j

NB: l'opérateur modulo est % (comme en C/JAVA)

SOLUTION 1 avec des boucles

SOLUTION 2:

  1. création de la matrice contenant les i+j
  2. application d'une fonction de transformation