Numpy agrega vectores 3D sin aplanar [duplicado]

Resuelto Joseph asked hace 6 años • 2 respuestas

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?

Joseph avatar Feb 22 '18 01:02 Joseph
Aceptado

Para simplificar visualmente, cambiemos el nombre video_132--> ay 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 bal auso:

In [84]: np.concatenate([a, b[None, :]]).shape
Out[84]: (65, 3)

Dado que np.concatenatedevuelve una nueva matriz, reasigne su valor de retorno apara "añadir" ba a:

a = np.concatenate([a, b[None, :]])
unutbu avatar Feb 21 '2018 18:02 unutbu

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 arres raveledsi 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.])

appenden 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.

concatenatees 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 concatenateal 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). appendRequiere el mismo ajuste de dimensión que concatenatesi 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)
hpaulj avatar Feb 21 '2018 22:02 hpaulj