Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/06/2008, à 08:52

no_spleen

[résolu] [python] tableaux numarray

Bonjour à tous,

J'utilise des vecteurs et des tableau numarray dans un programme. A certains endroits, il faut que je j'ajoute un élément d'une matrice dans un vecteur, en clair je dois faire :

B[i]=A[k,l]*10

Seulement, python n'accepte pas cela car A[k,l] fourni un tableau de rang 1 et non un scalaire. Comment transformer ce tableau de rang 1 en scalaire?

Bien à vous,

Sébastien

Dernière modification par no_spleen (Le 05/06/2008, à 13:27)

Hors ligne

#2 Le 05/06/2008, à 11:13

aleph

Re : [résolu] [python] tableaux numarray

> no_spleen

Tiens, ce nom me dit quelque chose http://forum.ubuntu-fr.org/viewtopic.php?pid=1125889#p1125889
Il semblerait que Python te donne satisfaction.

Pour ta question (si je l'ai bien comprise).

- il faut que tu utilises numpy
- pour ce genre de question, je pense qu'il est préférable de se tourner vers des forums/mailing lists orientés Python.
- dans une console

>>> mm = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8 ,9]])
>>> a = numpy.array([777, 888, 999])
>>> type(a[0])
<type 'numpy.int32'>
>>> type(mm[1, 1])
<type 'numpy.int32'>
>>> numpy.insert(a, [0], mm[1, 1])
[  5 777 888 999]
>>> print numpy.insert.__doc__
Return a new array with values inserted along the given axis
    before the given indices

    If axis is None, then ravel the array first.

    The obj argument can be an integer, a slice, or a sequence of
    integers.

    Example:
    >>> a = array([[1,2,3],
                   [4,5,6],
                   [7,8,9]])

    >>> insert(a, [1,2], [[4],[5]], axis=0)
    array([[1,2,3],
           [4,4,4],
           [4,5,6],
           [5,5,5],
           [7,8,9])

#3 Le 05/06/2008, à 11:31

no_spleen

Re : [résolu] [python] tableaux numarray

En effet, c'est bien la suite de ce post,

[parenthèse]
En fait, par la force des choses j'ai du commencer par écrire mon code en C++ (j'ai du me former aux éléments finis, et le cours se donnait en c++). Le code est terminé, mais j'en ai bavé (surtout au niveau de la gestion de la mémoire,les pointeurs,...). Comme ce code de base devra être pas mal amélioré, je me suis dit qu'il serait intéressant de voir avec quel facilité je peux le réécrire en python (pour faciliter la maintenance par la suite).

Effectivement, j'ai déjà recodé la majorité du code en un temps record (2 jours contre 1 mois en c++) mais je bloque sur cette dernière partie.

Quand j'aurai terminé, je ferai un petit compte-rendu sur le post http://forum.ubuntu-fr.org/viewtopic.ph … 9#p1125889

[/parenthèse]

Sinon pour mon problème il me semble que ta solution ne me convienne pas. En fait, j'utilise une librairie pour éléments finis (getfem) qui intègre une classe de matrices creuses. Je dois donc faire avec cette classe. Le problème c'est que je n'arrive pas à avoir accès à un élément d'un matrice sous forme d'un scalaire, car

A[i,j] me donne un truc du genre [[ 2.0006 ]], et on ne peux pas faire d'opérations algébriques sur ce genre d'élément

Hors ligne

#4 Le 05/06/2008, à 12:41

aleph

Re : [résolu] [python] tableaux numarray

> no_spleen

> A[i,j] me donne un truc du genre [[ 2.0006 ]], et on ne peux pas faire d'opérations algébriques sur ce genre d'élément.

Oui, je comprends tout à fait ton problème et j'aurais dû le mentionner explicitement. Tu as une matrice carrée (forcément) de rang 1, en gros dans le langage Python une liste de listes. Je n'ai plus Numeric ou NumArray aussi je ne l'ai pas testé et n'a plus en tête comment le faire.
Peut-être que quelque chose comme [ci-dessous] ferait l'affaire, sans garantie.

>>> a = [[4]]
>>> a[0][0]
4

Cela dit, l'essence de mon message n'est pas là. Numeric et NumArray sont obsolètes. Il y a effectivement quelques différences entre NumPy et NumArray. Le "paquet numérique" ad-hoc est depuis un certain temps déjà NumPy. (Le développement de Python se fait en tenant compte de NumPy , bien qu'il soit un module extérieur).
Je suis bien conscient que certaines libs utilisent encore NumArray ou Numeric, elles se font de plus en plus rares et c'est aussi un signe d'obsolescence.

Je ne connais pas tes besoins et ne je ne donnerais pas de conseils. Confronté à ce problème, je travaillerais au max en numpy pour mes besoins - mon code - quitte à devoir écrire moi-même une petite fonction de conversion.

Je ne connais pas getfem, mais google - getfem, numpy - donne quelques liens.

#5 Le 05/06/2008, à 13:27

no_spleen

Re : [résolu] [python] tableaux numarray

Merci, ça marche ! (je vais regarder du côté de numpy pour la suite de mon travail)

Hors ligne

#6 Le 05/06/2008, à 20:19

aleph

Re : [résolu] [python] tableaux numarray

> no_spleen

Pour info:

La numérique étant un peu mon dada, j'ai jeté un coup d'oeil à getfem. Effectivement, ce n'est pas un petit morceau et tu ne serais pas le seul à avoir quelques soucis avec NumPy. (-> Google)

Je pense quand même que pour la pérennité de ton code, l'utilisation de NumPy pour ton code est à conseiller, quitte à devoir faire des conversions numarray <--> numpy et essayer de séparer au mieux les tâches getfem et ton code.

Un papier assez intéressant sur le sujet http://www.stsci.edu/resources/software_hardware/numarray/numarray2numpy.pdf

Astuce. Généralement, les bonnes libs permettent une conversion en type/class de base Python pouvant être ainsi utilisées comme pivot.

>>> a = numpy.array([1,2,3])
>>> a
[1 2 3]
>>> list(a)
[1, 2, 3]
>>> tuple(a)
(1, 2, 3)
>>> mm = numpy.array([[6, 7],[8, 9]])
>>> mm
[[6 7]
 [8 9]]
>>> list(mm)
[array([6, 7]), array([8, 9])]
>>> newmm = []
>>> for vec in mm:
        newmm.append(list(vec))       
>>> newmm
[[6, 7], [8, 9]]
>>> type(newmm)
<type 'list'>

#7 Le 05/06/2008, à 21:55

no_spleen

Re : [résolu] [python] tableaux numarray

En effet, en cherchant j'ai vu que d'autres ont essayé d'utiliser numpy avec getfem. Malheureusement j'ai vu un post d'un des deux créateurs de la lib (on dit module en fait?) disant explicitement qu'il n'était pas prêt à faire le passage vers numpy (c'était en 2007).

En remplacant simplement import numarray par import numpy car ne marche pas

untimeError: unhandled argument type: <type 'numpy.ndarray'>

Evidemment !

Comme ce n'est pas mon seul problème avec cette librairie, je vais voir si il n'en existe pas une autre pour faire des éléments finis en python (par hasard tu n'en connaîtrais pas une ? Quelle méthode utilises-tu principalement ?)

Hors ligne

#8 Le 05/06/2008, à 22:31

aleph

Re : [résolu] [python] tableaux numarray

> no_spleen

> Comme ce n'est pas mon seul problème avec cette librairie, je vais voir si il n'en existe pas une autre pour faire des éléments finis en python (par hasard tu n'en connaîtrais pas une ? Quelle méthode utilises-tu principalement ?)

Rien, ce n'est pas mon rayon. Comme dit précédemment, mieux vaut consulter des forums ou mailing lists comme SciPy.

Accessoirement, rien que par curiosité, google - python finite elements - me propose quelques 60000 entrées...

#9 Le 05/06/2008, à 22:53

no_spleen

Re : [résolu] [python] tableaux numarray

C'est certain il existe des choses. Mais comme on ne peut vraiment juger de la qualité d'une librairie qu'en l'essayant, je voulais savoir si tu avais de l'expérience à partager !

Sinon mes possibilités ne manquent pas. Je peux essayer d'appeler mon programme c++ dans un programme python, et faire toutes les extensions nécessaires en python.

Finalement les fonctions éléments finis implémentées dans les librairies spécialisées ne sont pas très compliquées, mais ne doivent pas être très marrantes à programmer (je pense en autre au parser pour l'import de fichiers de maillages...). Je pourrais essayer de construire ma propre lib, mais ce serait sur mon temps libre (aucune valeur ajoutée à ma thèse).

En tous cas, merci beaucoup pour ton aide !

Sébastien

Hors ligne

#10 Le 06/06/2008, à 07:40

aleph

Re : [résolu] [python] tableaux numarray

>no_spleen

Juste un petit point qui me tracasse, je ne t'ai pas proposé de *remplacer* numarray par numpy, mais d'utiliser numpy "pour ta cuisine" "et" numarray parce ce que getfem l'utilise.