una transpuesta multiplicar matriz matrices funcion elementos ejemplos crear array agregar python arrays opencv numpy

python - transpuesta - numpy append



Agregar dimensiones a una matriz Numpy (6)

Alternativamente a

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

en la respuesta de @dbliss, también puedes usar numpy.expand_dims como

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

Por ejemplo (tomado del enlace de arriba):

x = np.array([1, 2]) print(x.shape) # prints (2,)

Entonces

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

rendimientos

array([[1, 2]])

y

y.shape

da

(1, 2)

Estoy comenzando con una matriz numpy de una imagen.

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

La forma es lo que puede esperar de una imagen RGB de 640x480.

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

Sin embargo, esta imagen que tengo es un marco de un video, que tiene 100 fotogramas de largo. Idealmente, me gustaría tener una única matriz que contenga todos los datos de este video, de modo que devuelva img.shape (480, 640, 3, 100) .

¿Cuál es la mejor manera de agregar el siguiente fotograma, es decir, el siguiente conjunto de datos de imagen, otra matriz de 480 x 640 x 3, a mi matriz inicial?


No hay una estructura en numpy que le permita agregar más datos más tarde.

En cambio, numpy pone todos sus datos en un bloque contiguo de números (básicamente, una matriz C), y cualquier cambio de tamaño requiere asignar un nuevo trozo de memoria para mantenerlo. La velocidad de Numpy proviene de poder mantener todos los datos en una matriz numpy en la misma porción de memoria; por ejemplo, las operaciones matemáticas se pueden paralelizar para la velocidad y obtienes menos errores de caché .

Entonces tendrás dos tipos de soluciones:

  1. Asigne previamente la memoria para la matriz numpy y complete los valores, como en la respuesta de JoshAdel, o
  2. Mantenga sus datos en una lista de python normal hasta que realmente se los necesite para unirlos (ver a continuación)

images = [] for i in range(100): new_image = # pull image from somewhere images.append(new_image) images = np.stack(images, axis=3)

Tenga en cuenta que no es necesario ampliar las dimensiones de las matrices de imágenes individuales primero, ni necesita saber cuántas imágenes espera con anticipación.


Puede usar np.concatenate() especificando qué axis agregar, usando np.newaxis :

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

Si estás leyendo de muchos archivos:

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


Seguí este enfoque:

import numpy as np import cv2 ls = [] for image in image_paths: ls.append(cv2.imread(''test.jpg'')) img_np = np.array(ls) # shape (100, 480, 640, 3) img_np = np.rollaxis(img_np, 0, 4) # shape (480, 640, 3, 100).


Simplemente puede crear una matriz del tamaño correcto por adelantado y llenarlo:

frames = np.empty((480, 640, 3, 100)) for k in xrange(nframes): frames[:,:,:,k] = cv2.imread(''frame_{}.jpg''.format(k))

si los marcos eran archivos jpg individuales que fueron nombrados de alguna manera particular (en el ejemplo, frame_0.jpg, frame_1.jpg, etc.).

Solo una nota, puede considerar usar una (nframes, 480,640,3) en su lugar.


Usted está preguntando cómo agregar una dimensión a una matriz NumPy, de modo que esa dimensión pueda crecer para acomodar datos nuevos. Se puede agregar una dimensión de la siguiente manera:

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