7
votes

Comment puis-je cavalier et / ou tronquer un vecteur à une longueur spécifiée à l'aide de NUMPY?

J'ai quelques listes: xxx

qui sont de longueur variable.

Je veux retourner un vecteur de longueur cinq, telle que si la longueur de la liste d'entrée est <5 alors il sera rembourré avec des zéros à droite, et s'il est> 5, il sera tronqué sur le 5ème élément.

Par exemple, entrée A retournerait np.array ([1,2,3,0,0]) et entrée b retournerait np.array ([1,2, 3,4,5]) .

Je me sens comme si je devrais pouvoir utiliser np.pad , mais je n'arrive pas à suivre la documentation.


1 commentaires

Pour utiliser np.pad, np.pad (x, ((0,5-len (x))), mode = 'constante', constante_values ​​= 0) est une matrice ([1, 2, 3, 0, 0]) Pour x = np.array ([1,2,3]), mais cela ne fonctionnera pas pour Len (x)> 5 donc dans ce cas, il suffit de trancher la matrice, par exemple si y = np.array ([1, 2,3,4,5,6]) puis y [: 5] = tableau ([1, 2, 3, 4, 5])


3 Réponses :


8
votes

Ceci pourrait être lent ou rapide, je ne suis pas sûr, mais cela fonctionne à votre objectif.

In [22]: pad = lambda a,i : a[0:i] if len(a) > i else a + [0] * (i-len(a))

In [23]: pad([1,2,3], 5)
Out[23]: [1, 2, 3, 0, 0]

In [24]: pad([1,2,3,4,5,6,7], 5)
Out[24]: [1, 2, 3, 4, 5]


1 commentaires

Pour une version numpy: pad = lambda a, i: a [0: I] si A.Shape [0]> iore np.hstack ((A, nzzzeros (i - A. 0] )))))



1
votes

version python périque, où a est une liste Python (pas un tableau NUMPY): a [: N] + [0,] * (n-len (a)) < /code >.dec.p>Pour exemple: xxx

fonction à l'aide de numpy: xxx


0 commentaires

3
votes

np.pad est surchargé, mieux pour ajouter une bordure autour d'une image 2D que d'ajouter des zéros à une liste.

J'aime le zip_longest , surtout Si les entrées sont des listes et que vous n'avez pas besoin d'être des matrices. C'est probablement le plus proche que vous trouverez à un code qui fonctionne sur toutes les listes à la fois en code compilé). xxx

est une version qui n'utilise pas np. Array du tout (sauvegarde de la hausse du tableau)

mais par elle-même, elle ne tronque pas. Il reste quelque chose comme [x [: 5] pour x in (a, b)]] .

Voici ma variation sur all_m S, fonctionnant Avec une liste simple ou une matrice 1D: xxx

d'une manière ou d'une manière ou d'une autre que les solutions NUMPLY NUMPY font la même chose - construisez un tableau vierge de la forme souhaitée , puis remplissez-le avec les valeurs pertinentes de l'original.

un autre détail - lorsque la solution pourrait, en théorie, renvoyer une vue au lieu d'une copie. Mais cela nécessite une manipulation de ce cas séparément d'un étui de pad.


Si la sortie souhaitée est une liste des éventuelles tableaux lents égaux, cela peut valoir la peine de les collecter dans un tableau 2D. xxx


0 commentaires