¿Cómo concatenar estas matrices numpy
?
primer np.array
con una forma (5,4)
[[ 6487 400 489580 0] [ 6488 401 492994 0] [ 6491 408 489247 0] [ 6491 408 489247 0] [ 6492 402 499013 0]]
segundo np.array
con una forma (1,5)
[ 16. 15. 12. 12. 17. ]
el resultado final debe ser
[[ 6487 400 489580 0 16] [ 6488 401 492994 0 15] [ 6491 408 489247 0 12] [ 6491 408 489247 0 12] [ 6492 402 499013 0 17]]
np.concatenate([array1, array2])
pero me sale este error
ValueError: all the input arrays must have same number of dimensions
¿Qué estoy haciendo mal?
Para usar np.concatenate
, necesitamos extender la segunda matriz a 2D
y luego concatenar a lo largo de axis=1
–
np.concatenate((a,b[:,None]),axis=1)
Alternativamente, podemos usar np.column_stack
que lo cuida –
np.column_stack((a,b))
Ejecución de la muestra
In [84]: a Out[84]: array([[54, 30, 55, 12], [64, 94, 50, 72], [67, 31, 56, 43], [26, 58, 35, 14], [97, 76, 84, 52]]) In [85]: b Out[85]: array([56, 70, 43, 19, 16]) In [86]: np.concatenate((a,b[:,None]),axis=1) Out[86]: array([[54, 30, 55, 12, 56], [64, 94, 50, 72, 70], [67, 31, 56, 43, 43], [26, 58, 35, 14, 19], [97, 76, 84, 52, 16]])
Si b
es tal que es una matriz 1D
de dtype=object
con una forma de (1,)
, lo más probable es que todos los datos dtype=object
contenidos en el único elemento que contiene, debemos aplanarlo antes de concatenar. Para ese propósito, podemos usar np.concatenate
en él también. Aquí hay una muestra de ejecución para aclarar el punto:
In [118]: a Out[118]: array([[54, 30, 55, 12], [64, 94, 50, 72], [67, 31, 56, 43], [26, 58, 35, 14], [97, 76, 84, 52]]) In [119]: b Out[119]: array([array([30, 41, 76, 13, 69])], dtype=object) In [120]: b.shape Out[120]: (1,) In [121]: np.concatenate((a,np.concatenate(b)[:,None]),axis=1) Out[121]: array([[54, 30, 55, 12, 30], [64, 94, 50, 72, 41], [67, 31, 56, 43, 76], [26, 58, 35, 14, 13], [97, 76, 84, 52, 69]])
También hay np.c_
>>> a = np.arange(20).reshape(5, 4) >>> b = np.arange(-1, -6, -1) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]]) >>> b array([-1, -2, -3, -4, -5]) >>> np.c_[a, b] array([[ 0, 1, 2, 3, -1], [ 4, 5, 6, 7, -2], [ 8, 9, 10, 11, -3], [12, 13, 14, 15, -4], [16, 17, 18, 19, -5]])
Puedes hacer algo como esto.
import numpy as np x = np.random.randint(100, size=(5, 4)) y = [16, 15, 12, 12, 17] print(x) val = np.concatenate((x,np.reshape(y,(x.shape[0],1))),axis=1) print(val)
Esto produce:
[[32 37 35 53] [64 23 95 76] [17 76 11 30] [35 42 6 80] [61 88 7 56]] [[32 37 35 53 16] [64 23 95 76 15] [17 76 11 30 12] [35 42 6 80 12] [61 88 7 56 17]]