0
votes

Reshaping Numpy Variable

Dans Python, j'ai une liste de valeurs dont j'ai besoin de rompre dans des tableaux plus petits en fonction des valeurs d'un autre tableau. Par exemple, j'ai cette gamme de chiffres: xxx

et j'en ai besoin pour se transformer en ce tableau: xxx

donné que j'ai cette matrice spécifiant les longueurs des parties cassées: xxx

J'ai essayé de regarder la documentation de remodelage numpy, et cette fonction semble faire ce que je veux, mais je ne suis pas Assurez-vous comment le faire fonctionner sans modifier l'ensemble de la matrice et le faire de manière essentiellement une «variable». J'ai également essayé de le faire à travers des boucles mais je ne peux pas sembler obtenir les indices pour fonctionner correctement.


2 commentaires

Soyez clair, quand parlez-vous de Python Listes , et lorsque Numby Numpy Tableaux . Ou utilisez-vous simplement tableau pour signifier la même chose que les listes.


Numpy a une fonction Split , mais tout ce qu'il fait est de prendre un tas de tranches. Collant avec votre liste: [Alist [0: 3], Alist [3: 5], Alist [5: 7], Alist [7: 8], ....] .


4 Réponses :


0
votes

En supposant que la somme des longueurs est toujours la même que la longueur de la liste, vous pouvez utiliser list.pop (0) : xxx

sortie: xxx

Remarque: list.pop Par défaut apparaît le dernier élément ", donc list.pop (0) < / code> est utilisé.


0 commentaires

1
votes

Si vous ne voulez pas inciter le coût supplémentaire d'élimination des éléments d'une liste, voici une façon de le faire, en utilisant ithertools.lice () : xxx

le tester: xxx

sortie: xxx


5 commentaires

Vous n'avez pas besoin de 0 comme début d'Islice, c'est la valeur par défaut. Juste islice (itérateur, longueur).


@Veky, vrai, mais sans doute, cela aide la lisibilité à mentionner le début de toute façon.


Pour moi, c'est la même chose que la plage. Si vous écrivez régulièrement la plage (0, 5) au lieu de la plage (5), alors je vous comprends, mais j'en doute. : -]


@Veky, vous gagnez - j'utilise régulièrement plage (5) plutôt que plage (0,5) . Je modifierai la réponse pour vous débarrasser du 0


En fait, je comprends votre malaise. Ce paramètre "Démarrer" est le seul endroit dans Core Python où les arguments par défaut ne vont pas "de la fin" -1, -2, -3, mais -1, -3, -2. Mais comme nous l'avons tellement habitué avec une portée, il serait dommage de ne pas utiliser le même idiome ici; De plus, depuis dans mon expérience, nous islice du début encore plus souvent que nous allons de 0.



0
votes

Si vous avez besoin de faire cette procédure pour de nombreuses listes, il peut être agréable d'avoir une fonction prédéfinie. Voici un, écrit complètement à l'aide de la plus hauteOrderPHONHON.

from itertools import accumulate, tee, chain
from operator import itemgetter

i2, i3 = tee(accumulate([3, 2, 2, 1, 3, 2]))
slicer = itemgetter(*map(slice, chain([None], i2), i3))

>>> print(slicer([6, 5, 3, 1, 4, 3, 2, 4, 1, 3, 6, 1]))
([6, 5, 3], [1, 4], [3, 2], [4], [1, 3, 6], [1])


0 commentaires

0
votes

solution à l'aide d'un générateur est ci-dessous.

my_list = [6, 5, 3, 1, 4, 3, 2, 4, 1, 3, 6, 1]
my_lens = [3, 2, 2, 1, 3, 1]

ans = [x for x in splitter(my_list, my_lens)]
print(ans)
# [[6, 5, 3], [1, 4], [3, 2], [4], [1, 3, 6], [1]]

text = 'a quick brown fox jumped over the lazy dog'
lengths = [2, 6, 6, 4, 7, 5, 4, 5, 3]
print([x for x in splitter(text, lengths)])
# ['a ', 'quick ', 'brown ', 'fox ', 'jumped ', 'over ', 'the ', 'lazy ', 'dog']

my_tuple = (6, 5, 3, 1, 4, 3, 2, 4, 1, 3, 6, 1)
my_lens = [3, 2, 2, 1, 3, 1]
print(tuple(x for x in splitter(my_tuple, my_lens)))
# ((6, 5, 3), (1, 4), (3, 2), (4,), (1, 3, 6), (1,))


0 commentaires