IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Accéder à des lignes ou des colonnes de tableau ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut Accéder à des lignes ou des colonnes de tableau ?
    Bonjour,

    aujourd'hui je stocke des données dans des numpy.array pour des produits matriciels : des points 3D que je multiplie par une matrice de passage (ouah !).

    Et aujourd'hui, j'ai envie de le faire propre. Du coup, je me demande : pour mon tableau de points, sachant que j'accède en général à un point en entier, vaut-il mieux que je stocke tout ça dans un tableau n_points*3 ou 3*n_points. Du coup, vaut-il mieux que mes points soient dans des "colonnes" ou dans des "lignes".

    En fortran et en C, je connais la réponse (qui n'est pas la même dans chaque langage d'ailleurs !), mais pas en python.

    En gros, les cases mémoires contiguës pour un numpy.array en python sont-elles celle d'une même ligne ou celles d'une même colonne (voilà, c'est plus clair comme ça.)

    Merci de votre réponse !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut
    En attendant, j'ai fait ce petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import time
    import numpy
    a=numpy.zeros([10000,10000])
    b=numpy.zeros([10000,10000])
     
     
    t1 = time.time()
    for i in range(10000):
        a[i,:] += 1
    t2 = time.time()
    print t2-t1
     
    t1 = time.time()
    for i in range(10000):
        b[:,i] += 1
    t2 = time.time()
    print t2-t1
    qui semble affirmer qu'il vaut mieux utiliser en bloc des lignes que des colonnes entières de numpy.array : 0.5s dans un cas contre plus de 11s dans l'autre.

    Cela est confirmé par votre expérience ?

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Bonsoir,

    Python n'est que l'API qui émerge de code écrits en C - voire des traces de Fortran pour NumPy.

    Dans le NumPy Book vous trouverez des tas d'informations sur comment sont représentés les tableaux en mémoire et différentes options pour aligner, compacter, qui peuvent être dans certains cas bénéfiques.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonsoir,

    il me semble qu'on peut switcher de l'ordre C vers l'ordre fortran à la création de l'array et que par défaut c'est le même ordre que le C.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut
    Merci pour cette référence du NumpyBook,

    pour finir, selon la doc python et le NumpyBook, il semblerait que les tableaux numpy soit par défaut dans le sens du C, ie le dernier indice est celui qui fait passer d'un emplacement mémoire à son voisin.

    Donc il vaudrait mieux manipuler les tableaux 2d de manière à extraire des lignes plutôt que des colonnes.

    Cependant, la performance de l'utilisation de ces tableaux, selon le Numpy Book dépendrait aussi des méthodes qu'on utilise sur ces tableaux : issues du C ou du Fortran.

    Il y a donc des cas où les numpy.array par défaut (formalisme C) sont adaptés, et des fois non si l'on utilise des méthodes basées sur du Fortran.

    Mais pour l'utilisation simple de mon exemple, il faut clairement choisir de mettre les données à extraire en ligne, comme cela est confirmé par le benchmark ci-dessus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/04/2008, 13h58
  2. Traitement des lignes [suppression des lignes vides]
    Par turbo_chess dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2007, 09h16
  3. Réponses: 12
    Dernier message: 01/03/2007, 16h48
  4. Figer des lignes et des colonnes dans un tableau
    Par Opo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 15/11/2006, 16h10
  5. Modifier l'enseble des lignes d'une colonne d'une table
    Par bencheikh dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 06/07/2006, 21h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo