Numpy agrega vectores 3D sin aplanar [duplicado]
tengo el siguiente vector
video_132.shape
Out[64]: (64, 3)
que le agregaría un nuevo vector 3D de tres valores
video_146[1][146][45]
tal que
video_146[1][146][45].shape
Out[68]: (3,)
y
video_146[1][146][45]
Out[69]: array([217, 207, 198], dtype=uint8)
cuando hago lo siguiente
np.append(video_132,video_146[1][146][45])
se supone que debo conseguir
video_132.shape
Out[64]: (65, 3) # originally (64,3)
Sin embargo obtengo:
Out[67]: (195,) # 64*3+3=195
Parece que aplana el vector.
¿Cómo puedo agregar preservando la estructura 3D?
Para simplificar visualmente, cambiemos el nombre video_132
--> a
y video_146[1][146][45]
--> b
. Los valores particulares no son importantes así que digamos
In [82]: a = np.zeros((64, 3))
In [83]: b = np.ones((3,))
Luego podemos agregar b
al a
uso:
In [84]: np.concatenate([a, b[None, :]]).shape
Out[84]: (65, 3)
Dado que np.concatenate
devuelve una nueva matriz, reasigne su valor de retorno a
para "añadir" b
a a
:
a = np.concatenate([a, b[None, :]])
Código para append
:
def append(arr, values, axis=None):
arr = asanyarray(arr)
if axis is None:
if arr.ndim != 1:
arr = arr.ravel()
values = ravel(values)
axis = arr.ndim-1
return concatenate((arr, values), axis=axis)
Observe cómo arr
es raveled
si no se proporciona ningún eje
In [57]: np.append(np.ones((2,3)),2)
Out[57]: array([1., 1., 1., 1., 1., 1., 2.])
append
en realidad está dirigido a casos simples como agregar un escalar a una matriz 1d:
In [58]: np.append(np.arange(3),6)
Out[58]: array([0, 1, 2, 6])
De lo contrario, el comportamiento es difícil de predecir.
concatenate
es la operación base (integrada) y toma una lista, no solo dos. Entonces podemos recopilar muchas matrices (o listas) en una lista y hacer una concatenate
al final de un ciclo. Y como no modifica las dimensiones de antemano, nos obliga a hacerlo nosotros mismos.
Entonces, para agregar una forma (3,) a (64,3), debemos transformar ese (3,) en (1,3). append
Requiere el mismo ajuste de dimensión que concatenate
si especificamos el eje.
In [68]: np.append(arr,b[None,:], axis=0).shape
Out[68]: (65, 3)
In [69]: np.concatenate([arr,b[None,:]], axis=0).shape
Out[69]: (65, 3)