TP Python - NumPy Sup'Biotech 2 Edouard Véron, Thibaut Baroyer Mardi 21 février 2017 TP: Python - NumPy 2016 - 2017 Préambule Propriété du document Auteurs Version Nombre de pages Edouard Véron, Thibaut Baroyer 1.0 7 Contact Contacter l'équipe assistante à l'adresse suivante: supbiotech-bioinfo-bt2@googlegroups. com Copyright Ce document est destiné aux étudiants de Sup'Biotech 2. Ce dernier a été téléchargé depuis www.intranet.supbiotech.fr. Si ce n'est pas le cas, contacter l'auteur à l'adresse indiquée plus haut. c Assistants Sup'Biotech 2016. 1 /7 TP: Python - NumPy 2016 - 2017 Table des matières 1 2 3 Introduction 2 Consignes 2 2.1 Modalités de rendu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Deadlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sujet 3.1 Revenons aux basiques . . . . . . . . . Exercice 1 Coco . . . . . . . Exercice 2 Test d'ADN . . . . Exercice 3 Score d'alignement . . 3.2 Numpy . . . . . . . . . . . . . . . . . . Exercice 4 Matrice symétrique . . Exercice 5 Concaténation. . . . Exercice 6 Matrice paire . . . . Exercice 7 Indice du max. . . . Exercice 8 Diminution de matrice. Exercice 9 Somme de matrices . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 3 3 3 4 4 5 5 5 6 6 6 7 Introduction L'objectif de ce TP est de valider vos acquis en Python. Pour cela, les exercices qui vous sont demandés font appel à toutes les notions dans ce langage vues depuis le début de vos études à Sup'Biotech. 2 Consignes Le TP est à réaliser par groupe de 1, 2 ou 3 personnes (maximum). Vous devrez rendre le code de votre projet selon les modalités décrites ci-dessous. 2.1 Modalités de rendu Le rendu se fera sur l'intranet de rendu habituel (http://supbiotech-bioinfo.sites.djangoeurope. com). Pour pouvoir rendre votre archive, vous devrez donc créer votre groupe sur l'intranet et y ajouter tous les membres. Votre code sera corrigé par un programme automatique, qui testera vos fonctions indépendamment les unes des autres et comparera leur résultat selon ce qui est demandé dans l'exercice correspondant. Vous devez donc rendre des chiers de code .py ne contenant que les fonctions qui vous sont demandées, et respectant l'architecture de rendue dénie plus bas. Ces chiers doivent se trouver dans une archive zip, dont le nom doit respecter la norme suivante : tp-04-login_l.zip, où login_l est à remplacer par le plus petit login des membres du groupe en considérant l'ordre lexicographique. En cas de doute, utilisez python : >>> min("faudra_a", "fau_b", "fau-ra_c") fau-ra_c L'architecture du rendu attendue est la suivante : 2 /7 TP: Python - NumPy 2016 - 2017 + tp-04-login_l.zip |- easy.py |- medium.py |- hard.py Remarquez que les chiers se trouvent à la racine de l'archive (et non pas dans un dossier). Conseil : avant de commencer à vous plonger dans votre code, et même à lire la suite du sujet, assurez-vous que vous savez comment faire pour rendre le TP en respectant les modalités de rendu : créez-vous un dossier de travail contenant les chiers Python (vides pour le moment) selon l'architecture demandée, puis faites votre Zip comme si vous rendiez. Assurez-vous ensuite que votre archive n'est pas corrompue. Pour le tester, vous pouvez par exemple essayer de l'ouvrir sur l'ordinateur d'un autre membre de votre groupe. 2.2 Deadlines Ce TP est à rendre avant ce soir 23h42. 3 Sujet Chaque exercice est indépendant, vous pouvez donc les faire dans l'ordre que vous voulez. Voici le tableau de correspondances chier -> fonctions demandées. Fichier easy.py medium.py hard.py 3.1 Fonctions parrot, is_odd, my_sum is_dna_rec, is_symetric, score_dummy, remove extend, array_max_coords, score Revenons aux basiques Commençons par nous remettre dans le Python, et à nous assurer que les bases sont toujours bien là. Exercice 1: Coco Écrire la fonction parrot(s: string) -> int qui ache la chaîne de caractères s et retourne le nombre de caractères qu'elle contient : In [1]: parrot("perroquet") perroquet Out[1]: 9 Si la chaîne de caractère est vide, votre fonction devra avoir le comportement suivant : In [1]: parrot("") coco Out[1]: 4 3 /7 TP: Python - NumPy 2016 - 2017 Exercice 2: Test d'ADN Écrire la fonction is_dna_rec(seq: string) -> bool qui retourne True ssi la chaîne de caractères seq est de l'ADN. Votre fonction doit impérativement être récursive ! In [1]: is_dna_rec("ACCCC") Out[1]: True In [2]: is_dna_rec("ACTQA") Out[2]: False In [3]: is_dna_rec("") Out[3]: True Exercice 3: Score d'alignement Un algorithme nous retourne deux séquences alignées x, y mais pas le score de l'alignement. On souhaite donc retrouver ce score en partie, correspondant uniquement au score des correspondances/substitutions, calculé selon une matrice de substitution M : In [0]: from numpy import array In [1]: M = array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) In [2]: score_dummy("", "", M) Out[2]: 0 In [3]: score_dummy("AATCGCCT---GATGGCGA", "AA-CACCTGTTGAA--CGA", M) Out[3]: 11 Vous devez donc écrire la fonction score_dummy(x: string, y: string, M: array) -> int qui retourne le score de l'alignement comme déni plus haut. Vous devez utiliser la builtin Python zip (vous référer à la documentation sur internet). On suppose que les 2 séquences x et y sont de même taille, et que la matrice M (qui représente la fameuse matrice Σ) est sous la forme suivante (prêtez bien attention à l'ordre des nucléotides A, T , G et C correspondant aux indices de la matrice) : A T G C ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Bonus : Écrire la fonction score(x: string, y: string, M: array, g: function) -> int qui calcule le score complet de l'alignement, c'est-à-dire qu'il prend également en compte les trous, dont le score est calculé selon la fonction d'évaluation de trous g : A Σ= T G C In [0]: from numpy import array 4 /7 TP: Python - NumPy 2016 - 2017 In [1]: M = array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) In [2]: def g(x): return -0.5*len(x) In [3]: score("", "", M, g) Out[3]: 0 In [4]: score("AATCGCCT---GATGGCGA", "AA-CACCTGTTGAA--CGA", M, g) Out[4]: 8 3.2 Numpy Voici maintenant quelques exercices courts dont le but est de vous montrer que Numpy est votre ami lorsqu'il s'agit de manipuler des tableaux. Exercice 4: Matrice symétrique En une ligne, écrire la fonction is_symetric(M -> array) -> boolean qui renvoie True ssi la matrice M est symétrique, False sinon. Exercice 5: Concaténation Écrire la fonction extend(M -> array, r -> array, c -> array) -> array qui ajoute à la matrice M une nouvelle ligne correspondant à r, puis une nouvelle colonne correspondant à c. On suppose que r et c sont de la bonne taille : In [0]: from numpy import array In [1]: a = array([[1, 2], [4, 5], [7, 8]]) In [2]: a Out[2]: array([[ 1, 2], [ 4, 5], [ 7, 8]]) In [3]: extend(a, array([10, 11]), array([3, 6, 9, 12])) Out[3]: array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]]) Indice : utile... la fonction append est votre amie ! Et sa documentation sur internet vous serait bien 5 /7 TP: Python - NumPy 2016 - 2017 Exercice 6: Matrice paire En une ligne, écrire la fonction is_odd(M -> array) -> boolean qui renvoie True ssi la matrice M ne contient que des nombres pairs, False sinon. Exercice 7: Indice du max A partir d'un array A (de dimension quelconque), nous souhaitons récupérer les coordonnées du plus grand nombre qu'elle contient (s'il y en a plusieurs, nous voulons les coordonnées de la première occurrence). Écrire la fonction array_max_coords(A -> array) -> tuple of int qui permette de récupérer ces coordonnées : In [0]: from numpy import array In [1]: a = array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]) In [2]: a Out[2]: array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16]]) In [3]: array_max_coords(a) Out[3]: (3, 3) In [4]: a = array([[1, 2, 3, 4], [5, 6, 77, 8], [9, 10, 11, 12], [13, 14, 15, 16]]) In [5]: a Out[5]: array([[ 1, 2, 3, 4], [ 5, 6, 77, 8], [ 9, 10, 11, 12], [13, 14, 15, 16]]) In [6]: array_max_coords(a) Out[6]: (1, 2) Attention : votre fonction ne doit pas faire plus de 2 lignes Conseil : Numpy fournit toutes les fonctions qu'il faut pour arriver au résultat tout en respectant les contraintes Indice : demandez-le moi durant le TP et je vous le donnerais si j'estime que c'est mérité Exercice 8: Diminution de matrice Écrire la fonction remove(M -> array, r -> int, c -> int) -> array qui supprime la ligne d'indice r puis la colonne d'indice c de la matrice M : 6 /7 TP: Python - NumPy 2016 - 2017 In [0]: from numpy import array In [1]: a = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) In [2]: a Out[2]: array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]]) In [3]: delete(a, 2, 1) Out[3]: array([[ 1, 3], [ 4, 6], [10, 12]]) Exercice 9: Somme de matrices Nous vous demandons ici d'écrire la fonction my_sum(M1 -> array, M2 -> array) -> array qui eectue la somme des 2 matrices M1 et M2, que l'on suppose être de même taille. 7 /7