178 votes

Comment ajouter de nouvelles dimensions à un tableau Numpy ?

Je commence avec un tableau numpy d'une image.

In[1]:img = cv2.imread('test.jpg')

La forme est celle à laquelle on peut s'attendre pour une image RVB de 640x480.

In[2]:img.shape
Out[2]: (480, 640, 3)

Cependant, l'image que je possède est une image d'une vidéo de 100 images. Idéalement, j'aimerais avoir un tableau unique qui contienne toutes les données de cette vidéo, de telle sorte que img.shape renvoie à (480, 640, 3, 100) .

Quelle est la meilleure façon d'ajouter l'image suivante - c'est-à-dire le prochain ensemble de données d'image, un autre tableau 480 x 640 x 3 - à mon tableau initial ?

204voto

dbliss Points 3500

Vous demandez comment ajouter une dimension à un tableau NumPy, afin que cette dimension puisse ensuite être augmentée pour accueillir de nouvelles données. Une dimension peut être ajoutée comme suit :

image = image[..., np.newaxis]

108voto

Cleb Points 9410

Alternativement à

image = image[..., np.newaxis]

sur La réponse de @dbliss vous pouvez également utiliser numpy.expand_dims comme

image = np.expand_dims(image, <your desired dimension>)

Par exemple (extrait du lien ci-dessus) :

x = np.array([1, 2])

print(x.shape)  # prints (2,)

Puis

y = np.expand_dims(x, axis=0)

donne

array([[1, 2]])

et

y.shape

donne

(1, 2)

33voto

JoshAdel Points 15911

Vous pourriez simplement créer un tableau de la taille correcte à l'avance et le remplir :

frames = np.empty((480, 640, 3, 100))

for k in xrange(nframes):
    frames[:,:,:,k] = cv2.imread('frame_{}.jpg'.format(k))

si les images étaient des fichiers jpg individuels nommés d'une manière particulière (dans l'exemple, frame_0.jpg, frame_1.jpg, etc.).

Juste une remarque, vous pourriez envisager d'utiliser un (nframes, 480,640,3) à la place.

27voto

0-_-0 Points 667

Pythonique

X = X[:, :, None]

ce qui est équivalent à

X = X[:, :, numpy.newaxis] et X = numpy.expand_dims(X, axis=-1)

Mais comme vous demandez explicitement à empiler des images, je vous recommande d'opter pour l'empilement des list d'images np.stack([X1, X2, X3]) que vous avez peut-être collecté dans une boucle.

Si vous n'aimez pas l'ordre des dimensions, vous pouvez les réarranger avec np.transpose()

9voto

Saullo Castro Points 12260

Vous pouvez utiliser np.concatenate() en précisant quels axis pour ajouter, en utilisant np.newaxis :

import numpy as np
movie = np.concatenate((img1[:,np.newaxis], img2[:,np.newaxis]), axis=3)

Si vous lisez à partir de plusieurs fichiers :

import glob
movie = np.concatenate([cv2.imread(p)[:,np.newaxis] for p in glob.glob('*.jpg')], axis=3)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X