web-dev-qa-db-fra.com

Comment n'aplanir que quelques dimensions d'un tableau numpy

Existe-t-il un moyen rapide de "sous-aplatir" ou d'aplatir uniquement certaines des premières dimensions d'un tableau numpy?

Par exemple, étant donné un tableau numpy de dimensions (50,100,25), les dimensions résultantes seraient (5000,25)

91
Curious

Jetez un oeil à numpy.reshape .

>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)

>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape   
# (5000, 25)

# One shape dimension can be -1. 
# In this case, the value is inferred from 
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)
100
Alexander

Une légère généralisation à la réponse d'Alexander - np.reshape peut prendre -1 comme argument, ce qui signifie "taille totale du tableau divisée par le produit de toutes les autres dimensions de la liste":

par exemple. pour aplatir toutes les dimensions sauf la dernière:

>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)
71
Peter

Une légère généralisation à la réponse de Peter: vous pouvez spécifier une plage sur la forme du tableau d'origine si vous souhaitez aller au-delà des tableaux à trois dimensions.

par exemple. pour aplatir toutes les dimensions sauf la dernière deux:

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

EDIT: Une légère généralisation à ma réponse précédente - vous pouvez bien sûr également spécifier une plage au début de la refonte également:

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)
22
KeithWM

Une autre approche consiste à utiliser numpy.resize() comme dans:

In [37]: shp = (50,100,25)
In [38]: arr = np.random.random_sample(shp)
In [45]: resized_arr = np.resize(arr, (np.prod(shp[:2]), shp[-1]))
In [46]: resized_arr.shape
Out[46]: (5000, 25)

# sanity check with other solutions
In [47]: resized = np.reshape(arr, (-1, shp[-1]))
In [48]: np.allclose(resized_arr, resized)
Out[48]: True
1
kmario23