En Python, est-il possible d'écrire une fonction qui retourne les dimensions d'un tableau multidimensionnel (étant donné l'hypothèse que les dimensions du tableau ne sont pas irrégulières)?
Par exemple, les dimensions de [[2,3], [4,2], [3,2]]
serait [3, 2]
, tandis que les dimensions de [[[3,2], [4,5]],[[3,4],[2,3]]]
serait [2,2,2]
.
Python possède-t-il des fonctions intégrées qui renverront toutes les dimensions d'un tableau multidimensionnel, ou devrais-je implémenter cette fonction moi-même?
Non, il n'y a rien de intégré car avec de tels "tableaux"1 il peut être irrégulier et le concept de "dimensions" ou de "forme" n'a aucun sens. Vous devrez donc écrire le vôtre. Si vous pouvez faire une hypothèse d'uniformité sur toutes les dimensions, vous pouvez procéder comme suit:
dim1 = len(a)
dim2 = len(a[0])
dim3 = len(a[0][0])
.
.
.
Il serait assez facile de rendre ce récursif pour gérer toutes les dimensions. Cela devrait le faire:
def dim(a):
if not type(a) == list:
return []
return [len(a)] + dim(a[0])
Mais si vous avez besoin de quelque chose comme ça, vous voudrez peut-être envisager de regarder NumPy tableaux qui ont numpy.ndarray.shape
qui vous donnerait ce que vous cherchez.
from numpy import array
l = [[2, 3], [4, 2], [3, 2]]
a = array(l)
print a.shape
Production
(3, 2)
1 Dans des citations effrayantes parce que vous ne regardez pas vraiment un tableau, vous regardez une liste, ou une liste de listes, ou une liste de listes de listes ...
Vous pouvez le faire avec numpy:
import numpy
l = [[2,3], [4,2], [3,2]]
m = numpy.array(l)
print m.shape
Mais la forme de votre deuxième exemple est [2,2,2], pas [1,4,5], sauf si j'ai mal compris votre question ...
Ce n'est pas un tableau multidimensionnel. C'est un list
. Il se trouve qu'il contient d'autres listes. Il n'y a rien à dire que votre liste ne pourrait pas être:
[[2,3], [4,2], [3,2,4,5,6]]
Dans ce cas, quelle valeur attendez-vous d'une telle fonction?
Il n'y a pas de fonction générale qui fait ce que vous demandez, notamment parce que Python lui-même ne définit pas une classe matrice/tableau. Vous pouvez certainement écrire votre propre fonction qui fonctionne sur des objets itérables comme les listes et les tuples si vous êtes prêt à faire des hypothèses ou à écrire des assertions quant à l'uniformité de la liste. Utilisez len(a)
pour la première dimension, len(a[0])
pour la seconde, et ainsi de suite. La récursivité sois ton ami ici.
Si vous avez utilisé un tableau numpy pour votre matrice, ce qui, pour être honnête, aurait beaucoup de sens, alors votre fonction existerait (c'est la propriété shape
de la classe ndarray) et aurait un sens.
En supposant que le tableau d'entrée n'est pas irrégulier:
def arr_dimen(a):
return [len(a)]+arr_dimen(a[0]) if(type(a) == list) else []