Existe-t-il des spécifications pour le comportement de la prise de tranches à plusieurs niveaux avec une liste Python de listes? Par exemple, voici une liste 4 x 5 x 3 de listes:

>>> a_4_by_5_by_3 = [[[(5*3*r + 3*c + p) for p in range(0,3)] for c in range(0,5)] for r in range(0,4)]
>>> a_4_by_5_by_3
[[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]], [[15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29]], [[30, 31, 32], [33, 34, 35], [36, 37, 38], [39, 40, 41], [42, 43, 44]], [[45, 46, 47], [48, 49, 50], [51, 52, 53], [54, 55, 56], [57, 58, 59]]]

Si vous prenez une tranche à deux éléments dans la première dimension et une tranche à trois éléments dans la deuxième dimension, le code n'est pas rejeté, mais le découpage dans la deuxième dimension semble être ignoré:

>>> a_4_by_5_by_3[0:2][0:3]
[[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]], [[15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29]]]

Si le découpage dans la deuxième dimension n'était pas ignoré, il n'y aurait que trois éléments par ligne:

[[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[15, 16, 17], [18, 19, 20], [21, 22, 23]]]

Est-ce un comportement connu? Je n'ai rien trouvé dans la documentation officielle de Python qui commente dans un sens ou dans l'autre. J'utilise Python 3.6, pour ce que ça vaut.

0
Alan 29 avril 2020 à 01:27

2 réponses

Meilleure réponse
x = a_4_by_5_by_3[0:2][0:3]

Est fondamentalement équivalent à

x = a_4_by_5_by_3[0:2]
x = x[0:3]

, vous finissez donc par obtenir une tranche de 2 éléments, puis en essayant de découper jusqu'au troisième élément, qui est implicitement réduit à la longueur de la séquence.

Si vous cherchez à découper des matrices multidimensionnelles à volonté, vous voudrez probablement en faire des tableaux Numpy, qui ont opérations d'indexation très intéressantes.

4
AKX 29 avril 2020 à 05:30

Vous pourriez obtenir le découpage souhaité de cette façon:

[x[:3] for x in a_4_by_5_by_3][:2]
0
Peter Pesch 28 avril 2020 à 22:52