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

Calcul scientifique Python Discussion :

Numpy : quelle différence un ndarray(5,) et un ndarray(1,5)


Sujet :

Calcul scientifique Python

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut Numpy : quelle différence un ndarray(5,) et un ndarray(1,5)
    Bonjour,

    Voici un bout de code et son résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import numpy as np
     
    x = np.random.rand(5)
    print(x)
    print(type(x))
    print(x.shape)
     
    x = np.random.rand(1, 5)
    print(x)
    print(type(x))
    print(x.shape)
    [0.60750665 0.90682901 0.71761544 0.76073789 0.46655106]
    <class 'numpy.ndarray'>
    (5,)
    [[0.04000783 0.71784235 0.946608   0.77873071 0.82963164]]
    <class 'numpy.ndarray'>
    (1, 5)
    J'ai un peu du mal à comprendre la subtile nuance entre les 2. Pouvez-vous m'éclaire ?

    Je ne sais pas trop comment nommer les choses pour faire une recherche intelligente sur le net.

    J'ai l'impression que le premier ndarray est un vecteur, au sens strict. Il n'est pas question de ligne ou de colonne. J'ai cette impression car sa transposée est égale à lui-même :
    x = np.random.rand(10)
    x.shape
    Out[6]: (10,)
    x.T.shape
    Out[7]: (10,)
    Le second ndarray est vraiment une matrice 2 dimensions. Ici, sa première dimension est de taille 1 donc c'est un vecteur ligne. Sa transposée donne bien un vecteur colonne :
    x = np.random.rand(1, 10)
    x.shape
    Out[9]: (1, 10)
    x.T.shape
    Out[10]: (10, 1)
    Est-ce correct ? Peut-on passer un <class 'numpy.ndarray'> de forme (5,) là où un (1, 5) est attendu ? J'ai fait cette expérience dans un code tiré d'un tuto et ça a fonctionné : le code original avait un (1, n) et je lui ai passé un (n,) sans soucis.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Bktero Voir le message
    J'ai un peu du mal à comprendre la subtile nuance entre les 2. Pouvez-vous m'éclaire ?
    Dans les 2 cas, on accède à 5 emplacements mémoire contigus.
    La différence est côté accès à ces données.
    Dans un cas, on le fait via un tableau à une seule dimension (un seul index) qu'on peut appeler "vecteur" alors que dans l'autre on a un tableau à deux dimensions (2 index).
    Ce qui peut forcer à des .reshape pour certaines opérations (où à utiliser des "matrix" qui sont au moins 2D pour ne pas se mélanger les pinceaux).

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

  3. #3
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Cette nuance est une bonne source d'erreur. Je ne compte plus le nombre de fois où je me suis planté dans des calculs matriciels en ayant un 1D-array en lieu et place d'un 2D-array... Un 1D array est une sorte de liste, alors qu'un 2D array est une matrice. Ce qui fait qu'une transposée de d'un 1D-array, reste un 1D-array.

    Un array (5,) est de dimension 1, tandis qu'un array (5,1) ou (1,5) est de dimension 2. Certaines fonctions de numpy n'accepte que l'un ou l'autre, d'autres les deux, ce qui n'aide pas vraiment à faire attention. La doc l'indique souvent (voir ici, notamment la phrase xp : 1-D sequence of floats). Je crois que le produit matriciel np.dot() accepte l'un ou l'autre et s'arrange pour que ça marche.
    Tu as peut-être raison sur la notion de vecteur. Mais je préfère juste garder en tête 1D vs 2D. Parce qu'un vecteur peut être un vecteur ligne ou colonne.

    J

Discussions similaires

  1. Réponses: 67
    Dernier message: 16/12/2007, 13h41
  2. [D2006] - C# ou Pascal Objet - Quelle différence
    Par RamDevTeam dans le forum Delphi .NET
    Réponses: 15
    Dernier message: 10/03/2006, 01h07
  3. [Outils][ADO.NET]Quelles différences DataSet/Hibernate ?
    Par kunfuka dans le forum EDI/Outils
    Réponses: 8
    Dernier message: 16/01/2006, 21h37
  4. [xsl][xslt][xslfo]quelles différences ?
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/01/2006, 13h16
  5. Quelle différence entre "réel simple" et "déc
    Par pyxosledisciple dans le forum Access
    Réponses: 2
    Dernier message: 11/01/2006, 11h51

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