web-dev-qa-db-fra.com

Trouver les dimensions d'un tableau multidimensionnel Python

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?

13
Anderson Green

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 ...

25
jason

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 ...

12
Ben

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.

5
David Heffernan

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 []
3
Archit Jain