Comment puis-je partitionner ce tableau en tableaux de longueur 3, avec un reste rembourré ou non (peu importe)
>>> np.array ([0,1,2,3,4,5,6,7,8,9,10]). reshape ([3, -1])
ValueError: impossible de remodeler un tableau de taille 11 en forme (3, nouvel axe)
3 Réponses :
### Two Examples Without Padding x = np.array([0,1,2,3,4,5,6,7,8,9,10]) desired_length = 3 num_splits = np.ceil(x.shape[0]/desired_length) print(np.array_split(x, num_splits)) # Prints: # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])] x = np.arange(13) desired_length = 3 num_splits = np.ceil(x.shape[0]/desired_length) print(np.array_split(x, num_splits)) # Prints: # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10]), array([11, 12])] ### One Example With Padding x = np.arange(13) desired_length = 3 padding = int(num_splits*desired_length - x.shape[0]) x_pad = np.pad(x, (0,padding), 'constant', constant_values=0) print(np.split(x_pad, num_splits)) # Prints: # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11]), array([12, 0, 0])]
Cela ne fonctionne pas comme prévu pour toutes les longueurs de x
. Si vous faites x = np.arange (13)
, par exemple, vous aurez 4 éléments dans le premier tableau.
Bonne prise, ça doit être le plafond et non l'arrondi.
Si vous voulez compléter avec des zéros, ndarray.resize ()
le fait pour vous, mais vous devez déterminer vous-même la taille du tableau attendu:
[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 0]]
Ce qui donne:
import numpy as np x = np.array([0,1,2,3,4,5,6,7,8,9,10]) cols = 3 rows = np.ceil(x.size / cols).astype(int) x.resize((rows, cols)) print(x)
Pour autant que je sache, c'est des centaines de fois plus rapide que l'approche de compréhension de liste (voir mon autre réponse).
Notez que si vous faites quelque chose sur x
avant de redimensionner, vous pourriez rencontrer un problème avec les «références». Soit travailler sur x.copy ()
, soit passer refcheck = False
à resize()
.
C'est probablement la meilleure solution de remplissage, sauf si vous n'êtes pas autorisé à redimensionner.
Si vous voulez éviter de remplir avec des zéros, la façon la plus élégante de le faire pourrait être de découper une liste de compréhension:
>>> import numpy as np >>> x = np.arange(11) >>> [x[i:i+3] for i in range(0, x.size, 3)] [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])]
Remplissez-le d'abord (avec, par exemple,
np.pad
), puis remodelez-le.connaissez-vous un moyen de le garnir au facteur 3 le plus proche? (ou N)