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 !

10 réponses

1 2
Avatar
Do Re Mi chel La Si Do
Bonjour !

Ceci n'irait-il pas plus vite ?

b = [0 for i in xrange(30)]
a=[]
for i in xrange(15):
a.append(b)
print a



@-salutations

Michel Claveau
Avatar
Do Re Mi chel La Si Do
Re

Oublie ma suggestion.
On n'obtient qu'une liste de 15 pointeurs sur l'objet appelé 'b'
Et ce n'est pas ce qui a été demandé.

@-salutations

Michel Claveau
Avatar
Do Re Mi chel La Si Do
Re

Je suis de retour. En langage vendredien : I am sur le return !

Avec une suggestion :
a=[[0 for i in xrange(30)] for i in xrange(15)]

Bonne sieste

Michel Claveau - Zzzzzzzzzzzzzzzzz
Avatar
Sebastien Aubry
Re

Je suis de retour. En langage vendredien : I am sur le return !

Avec une suggestion :
a=[[0 for i in xrange(30)] for i in xrange(15)]


Bonjour,

Et même : a = [[0] * 30 for i in xrange(15)]

Avatar
Do Re Mi chel La Si Do
Oui, effectivement. Fallait y penser...

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

Michel Claveau
Avatar
Amaury
Et, autant continuer : a=[[0]*30]*15


Non, tu as là aussi quinze références vers un seul tableau à 30
éléments. La preuve:

a=[[0]*30]*15
a[0][1]=5
a[0][1]
5



a[7][1]
5




Pas très utile, comme matrice...

Amaury



Avatar
Sébastien Aubry
Do Re Mi chel La Si Do wrote:
Oui, effectivement. Fallait y penser...

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


C'est volontairement que je ne l'ai pas fait, à cause des problèmes de
référence décrits dans la première réponse à ton message.
Autant on peut recopier 0 ou None, autant dès qu'il s'agit d'une liste,
il faut en faire des copies.

Sébastien Aubry

Avatar
Do Re Mi chel La Si Do
Oui-da ; la sieste n'a pas été une réussite...
Avatar
Do Re Mi chel La Si Do
Voir réponse à Amaury.
Avatar
regis
Le Fri, 24 Jun 2005 13:54:17 +0200, Do Re Mi chel La Si Do a écrit :


Je suis de retour. En langage vendredien : I am sur le return !



Essayes ça:
import sys
def sieste():
sys.stdout.write("z")

while 1:
sieste()


Bonne sieste


Juste après le boulot, sur le canapé :)


Michel Claveau - Zzzzzzzzzzzzzzzzz


Régis
--
Beuvez beuvez, mais bourré jamais

1 2