2
votes

Remodeler numpy avec le reste jette une erreur

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)


2 commentaires

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)


3 Réponses :


2
votes
### 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])]

2 commentaires

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.



0
votes

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


1 commentaires

C'est probablement la meilleure solution de remplissage, sauf si vous n'êtes pas autorisé à redimensionner.



1
votes

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])]


0 commentaires