Tableau de vecteurs en Python

Bonjour
Ma question va sans doute sembler très simple aux experts, mais je n'en suis pas un !

Je souhaiterais créer un tableau de 100 lignes et 100 colonnes en Python, dont chaque case contiendrait un vecteur $[x,y,z]$ à trois coordonnées.
Un programme du genre :
T=np.array((100,100))
for i in range(100):
    for j in range(100):
        T[i,j]=[1,2,3]
me conduit à une erreur
" IndexError: too many indices for array "

J'imagine que le programme voudrait que je mette un nombre dans
chaque case, et non pas un vecteur à 3 coordonnées.
Que puis-je faire pour y parvenir ?
Merci d'avance pour votre aide,
$\alpha$-Nico

[Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]

Réponses

  • T = np.zeros((100,100,3))
    for i in range(100):
        for j in range(100):
            T[i,j,:] = [1,2,3]
    
  • Bonjour HéHéHé,
    Merci pour ta réponse rapide qui fonctionne parfaitement !

    J'ai une deuxième question : avec ce tableau T ainsi créé, je voulais
    fabriquer une image avec le module PIL avec la commande :
    ImagePIL=Image.fromarray(T3D)
    
    mais Python me répond :
    " TypeError: Cannot handle this data type"

    Pourtant, lorsque j'ouvre une image JPEG avec PIL,
    le format me semble être le même, à savoir :
    " <class 'numpy.ndarray'> "

    As-tu une idée d'où pourrait venir le problème ?
    Merci encore par avance pour ton aide,
    $\alpha$-Nico
  • Affiche un élément du tableau, pour voir exactement à quoi il ressemble.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Je ne connais pas PIL, mais je viens de faire un petit test en important une image (à partir d'un des exemples ici) ; je constate que l'image est un tableau 2D par opposition au tableau 3D tel qu'il a été défini précédemment: je conseille donc d'extraire la partie qui intéresse avec numpy.copy par exemple, avant d'utiliser PIL.

    Nota bene:
    • c'est purement subjectif, mais je préfère travailler sur 3 tableaux 2D (X, Y, Z) que sur un tableau 3D où X, Y, Z sont les 3 couches
    • d'ailleurs je n'utilise jamais de tableau 3D
    • je rappelle que Python est un langage interprété (par opposition à un langage compilé comme le $C/C++$ par exemple qui de fait est plus rapide): l'utilisation de boucles coûte (très) cher
    • les boucles sont le dernier recours quand la vectorisation ne fonctionne pas ou elle ne peut pas être évitée
    • Numpy a été développée par des scientifiques pour les scientifiques, donc je ne saurais trop vous conseiller de vous y intéresser, particulièrement pour des matrices de grandes tailles

    Juste un retour d'expérience (je travaille communément sur des matrices de plusieurs millions de lignes et plusieurs dizaines de colonnes)

    Paul
  • en transformantt l'image en array avec np.asarray on remarque que c'est un tableau 3D de dimension $(n,n,4)$ et que les entiers sont de type uint8; quant à comprendre comment construire le tableau ?

    si ça peut aider

    Paul
    t0 = time.time()
    i = np.arange(n)
    j = np.ones(n)
    k = np.kron(i,j)
    T1 = np.reshape(k, (n,n) )
    Tbis = np.zeros( (n, n, 4), dtype = np.uint8 )
    Tbis[:, :, 0] = T1
    Tbis[:, :, 1] = T1
    Tbis[:, :, 2] = T1
    Tbis[:, :, 3] = T1
    t1 = time.time()
    # print(Tbis[:, :, 0])
    convertion = np.asarray(Tbis)
    ImagePIL=Image.fromarray(convertion)
    ImagePIL.show()
    
  • Quand tu vectorises, je suis presque certain qu’il y a quand même des boucles sauf qu’elles ne sont pas dans le script (interprété) mais dans la bibliothèque (compilée).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • c'est même à peu près certain et c'est comme n'importe quelle librairie scientifique (mathématique comme les autres), mais d'un point de vue de l'utilisateur final que nous sommes, c'est une façon de coder rapidement particulièrement pour les gros tableaux/matrices. J'ai fait la démonstration à l'un de mes anciens stagiaires qui avait utilisé 3 boucles imbriquées (40 minutes) alors qu'avec la vectorisation on l'a ramené à moins d'une minute :-P (calcul de la fonction objectif en optimisation).

    Numpy, Scilab, Julia, Matlab (et sûrement d'autres) proposent la vectorisation. Le $c/c++$ reste la référence en matière de rapidité (j'en suis resté au fortran 77, donc je ne peux plus vraiment comparer pour les version récentes; je me demande même s'il est encore enseigné)

    Paul
  • Si, Fortran est encore utilisé mais probablement plus en version 77.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
Connectez-vous ou Inscrivez-vous pour répondre.