OVH Cloud OVH Cloud

Creation rapide de tableaux multidimensionnels

15 réponses
Avatar
Bernard
Bonjour,

Premier problème :
Je cherche à créer de manière rapide un tableau à plusieurs dimensions
(par exemple une matrice).

A priori rempli de zéros mais c'est juste histoire de le créer avant de
commencer à le remplir, mais si c'est possible d'avoir des cellules
vides c'est encore mieux !

Pour l'instant je fais :
a = [0 for i in xrange(15)]
for i in xrange(15):
a[i] = [0 for j in xrange(30)]

Mais c'est loin d'être rapide avec 4 ou 5 dimensions et pleins de
cellules...

Une solution serait d'utiliser Numeric/numarray avec sa fonction zeros
aussi rapide que la lumière, mais si quelqu'un avait d'autres
propositions aussi efficaces, cela m'évitera une dépendance non
nécessaire...

Deuxième problème :
Est-il possible de créer un tableau Python directement à partir de code
C en interface ?
L'idéal étant que la fonction puisse renvoyer un objet 'tableau python'.
Je suppose qu'il faut bidouiller avec l'API mais je ne vois pas trop
comment.

L'idée étant de créer en C une fonction foo qui renvoie un tableau :
A = foo(2,3)
print A
A = [[0,0,0],[0,0,0]]

Pour l'instant j'utilise Pyrex et je fais une bête recopie d'un tableau
C vers un tableau Python, mais je suppose que je pourrais directement
manipuler en C le tableau Python ?

Merci d'avance !

5 réponses

1 2
Avatar
Bernard
On Fri, 24 Jun 2005 22:22:40 +0200, "Do Re Mi chel La Si Do"

Oui-da ; la sieste n'a pas été une réussite...



Merci à tous pour ces réponses !
Je vais garder a = [[0] * 30 for i in xrange(15)] pour le code non
optimisé et a = zeros(15,30) quand je dispose de numarray.

Au fait un détail rigolo : dans les dernières version de
Numeric/numarray on peut créer un tableau avec des objets Python avec
Numeric mais pas avec numarray ! c'est dommage comme régression...

Avatar
Do Re Mi chel La Si Do
Bonsoir !

ça marche ! Super ! Je vais pouvoir abandonner les somnifères.
Merci.

Michel Claveau
Avatar
regis
Le Sat, 25 Jun 2005 00:37:14 +0200, Do Re Mi chel La Si Do a écrit :

Bonsoir !

ça marche ! Super ! Je vais pouvoir abandonner les somnifères.
Merci.



J'ai fait une importante amélioration :

import sys,signal

def sieste():
sys.stdout.write("z")

def findesieste(sig,stack):
sys.exit("nHein? roooo putain déjà ! Bordel!nn")

signal.signal(signal.SIGINT,findesieste) while 1:
sieste()

Michel Claveau


Régis

--
Beuvez beuvez, mais bourré jamais

Avatar
Laurent Pointal
Bernard wrote:
Bonjour,

Premier problème :
Je cherche à créer de manière rapide un tableau à plusieurs dimensions
(par exemple une matrice).

A priori rempli de zéros mais c'est juste histoire de le créer avant de
commencer à le remplir, mais si c'est possible d'avoir des cellules
vides c'est encore mieux !

Pour l'instant je fais :
a = [0 for i in xrange(15)]
for i in xrange(15):
a[i] = [0 for j in xrange(30)]

Mais c'est loin d'être rapide avec 4 ou 5 dimensions et pleins de
cellules...


Déjà:
ligne = [0]*15
ligne
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]




Ensuite, tu peux utiliser soit le module copy, soit la notation [:] qui
retourne une copie.
a = []
for i in xrange(15) : a.append(ligne[:])
...



a
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0,



0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

Si tu as plus de dimensions, zieute deepcopy dans le module copy, ça
devrais être assez rapide tout en restant en Python pur.

A+

Laurent.



Avatar
Eric Deveaud
Do Re Mi chel La Si Do wrote:
Oui, effectivement. Fallait y penser...

Et, autant continuer : a=[[0]*30]*15



tu stockes 15 fois la même référence.

essayes encore ;-)

Eric


--
- Bientot==> Une rubrique membre avec photos
- Bientot==> "Un chat on line" pour discuter
Si j'amène la photo de mon membre, je pourai caresser le chat ?

-+- FF in Guide du Neuneu Usenet - Cha chanonchait bien pourtant -+-

1 2