Digamos que tengo una matriz NumPy a
:
a = np.array([
[1, 2, 3],
[2, 3, 4]
])
Y me gustaría agregar una columna de ceros para obtener una matriz b
:
b = np.array([
[1, 2, 3, 0],
[2, 3, 4, 0]
])
¿Cómo puedo hacer esto fácilmente en NumPy?
a = np.random.rand((N,N))
aa = np.random.rand(N,N)
np.r_[ ... ]
ynp.c_[ ... ]
son alternativas útiles paravstack
yhstack
, con corchetes [] en lugar de round ().Un par de ejemplos:
(La razón de los corchetes [] en lugar de round () es que Python se expande, por ejemplo, 1: 4 en cuadrado, las maravillas de la sobrecarga).
fuente
np.c_[ * iterable ]
; ver listas de expresiones .Uso
numpy.append
:fuente
append
en realidad solo llamaconcatenate
Una forma, usando hstack , es:
fuente
dtype
parámetro, no es necesario e incluso no está permitido. Si bien su solución es lo suficientemente elegante, preste atención para no usarla si necesita "agregar" con frecuencia a una matriz. Si no puede crear la matriz completa de una vez y llenarla más tarde, cree una lista de matrices yhstack
todo de una vez.Encuentro lo siguiente más elegante:
Una ventaja de esto
insert
es que también le permite insertar columnas (o filas) en otros lugares dentro de la matriz. Además, en lugar de insertar un solo valor, puede insertar fácilmente un vector completo, por ejemplo, duplicar la última columna:Lo que lleva a:
Para el momento,
insert
podría ser más lento que la solución de JoshAdel:fuente
insert(a, -1, ...)
para agregar la columna. Supongo que lo antepondré en su lugar.a.shape[axis]
. I. e. para agregar una fila, lo hacesnp.insert(a, a.shape[0], 999, axis=0)
y para una columna, lo hacesnp.insert(a, a.shape[1], 999, axis=1)
.También me interesó esta pregunta y comparé la velocidad de
que hacen lo mismo para cualquier vector de entrada
a
. Tiempos para crecera
:Tenga en cuenta que todas las variantes no contiguas (en particular
stack
/vstack
) son eventualmente más rápidas que todas las variantes contiguas.column_stack
(por su claridad y velocidad) parece ser una buena opción si necesita contigüidad.Código para reproducir la trama:
fuente
stack
,hstack
,vstack
,column_stack
,dstack
son todas las funciones auxiliares construidas sobrenp.concatenate
. Al rastrear la definición de pila , descubrí quenp.stack([a,a])
está llamandonp.concatenate([a[None], a[None]], axis=0)
. Puede ser bueno agregarnp.concatenate([a[None], a[None]], axis=0).T
al perfplot para mostrar quenp.concatenate
siempre puede ser al menos tan rápido como sus funciones auxiliares.c_
ycolumn_stack
Yo creo que:
Es más elegante.
fuente
np.concatenate también funciona
fuente
np.concatenate
parece ser 3 veces más rápido quenp.hstack
para las matrices 2x1, 2x2 y 2x3.np.concatenate
También fue un poco más rápido que copiar las matrices manualmente en una matriz vacía en mis experimentos. Eso es consistente con la respuesta de Nico Schlömer a continuación.Suponiendo que
M
es un (100,3) ndarray yy
es un (100,) ndarrayappend
se puede usar de la siguiente manera:El truco es usar
Esto se convierte
y
en una (100, 1) matriz 2D.ahora da
fuente
Me gusta la respuesta de JoshAdel debido al enfoque en el rendimiento. Una mejora de rendimiento menor es evitar la sobrecarga de inicializar con ceros, solo para sobrescribirse. Esto tiene una diferencia medible cuando N es grande, se usa vacío en lugar de ceros y la columna de ceros se escribe como un paso separado:
fuente
b[:,-1] = 0
. Además, con matrices muy grandes, la diferencia de rendimiento senp.insert()
vuelve insignificante, lo que podría sernp.insert()
más deseable debido a su brevedad.np.insert
También sirve el propósito.Inserta valores, aquí
new_col
, antes de un índice dado, aquí a loidx
largo de un eje. En otras palabras, los valores recién insertados ocuparán laidx
columna y moverán lo que estaba originalmente allí yidx
hacia atrás.fuente
insert
no está en su lugar como se podría suponer dado el nombre de la función (ver documentos vinculados en la respuesta).Agregue una columna adicional a una matriz numpy:
El
np.append
método de Numpy toma tres parámetros, los dos primeros son matrices numpy 2D y el tercero es un parámetro de eje que indica a lo largo de qué eje agregar:Huellas dactilares:
fuente
Un poco tarde para la fiesta, pero nadie publicó esta respuesta todavía, así que por razones de integridad: puede hacer esto con la comprensión de la lista, en una simple matriz de Python:
fuente
Para mí, la siguiente forma parece bastante intuitiva y simple.
fuente
En mi caso, tuve que agregar una columna de unos a una matriz NumPy
Después de X.shape => (97, 2)
fuente
Hay una función específica para esto. Se llama numpy.pad
Esto es lo que dice en la cadena de documentación:
fuente