{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Trucs et astuces plus avancés en numpy\n", "\n", "## Fonction de recherche `np.where`\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "a = np.random.randn(100,2)\n", "\n", "# element de la premiere colonne < 0.5\n", "index = np.where(a<0.5) # retourne les indices dans (I,J)\n", " # I: indice des lignes\n", " # J: indice des colonnes\n", "\n", "# recherche dans une colonne\n", "index2 = np.where(a[:,0]<0.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Attention au type de retour**\n", "\n", "Le type de `index` est sans surprise... Mais celui de `index2` est plus déroutant: il s'agit d'un tuple mais avec un seul champ rempli...\n", "Pour utiliser les indices extraits facilement, il faut donc faire:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "index2, = np.where(a[:,0]<0.5) # on ne s'intéresse qu'au premier membre!\n", "# a[index2,:] = ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fonction de recherche en syntaxe légère\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "y = np.array([-1, -1, -1, 1, 1, 1])\n", "x = np.random.rand(6,2)\n", "\n", "# sélection des 3 premières lignes de x\n", "print(x)\n", "print(x[y==-1])\n", "\n", "# contraintes logiques: \n", "# - x et y doivent avoir la même taille\n", "# - y doit être un vecteur\n", "\n", "# sélection des lignes de x qui commencent par un nombre > 0.5\n", "print(x[x[:,0]>0.5])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Transformation de matrice\n", "\n", "`np.where` permet de renvoyer une matrice transformée en ajoutant des arguments dans la méthode\n", "\n", "> `np.where(m > alpha, retour_si_vrai, retour_si_faux)`\n", "\n", "On peut se servir de cette syntaxe pour faire des comptages" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "a = np.random.randn(100,2)\n", "# Mettre à zeros tous les éléments négatifs:\n", "b = np.where(a<0., 0., a) # (clause, TODO if true, TODO if false)\n", "c = np.where(a<0., -1., 1.) # Extraire le signe des éléments de a\n", "\n", "nb_elem_pos = np.where(a>0., 1, 0).sum() # construction d'une matrice binaire + somme = comptage" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ATTENTION aux doubles clauses\n", "\n", "il y a un piège dans la priorité donnée aux opérations: il faut ajouter des parenthèses" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# pour l'estimation d'une loi jointe entre a et b\n", "N = 100\n", "a = np.ceil(np.random.rand(N) * 10) # entre 1 et 10\n", "b = np.round(np.random.rand(N)) # 0 ou 1\n", "np.where((a == 4) & (b==0), 1., 0.) # OK\n", "# np.where( a == 4 & b==0 , 1., 0.) # KO !!! => le & est prioritaire sur le == !!!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercice d'application\n", "\n", "Générer 1000 tirages selon une loi normale centrée réduite\n", " - Vérifier que la moitié (environ) des tirages est supérieure à 0\n", " - Vérifier que 2/3 des tirages sont compris entre entre moins l'écart-type et plus l'écart type" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }