Agregar una matriz NumPy a una matriz NumPy

180

Tengo un numpy_array. Algo así como [ a b c ].

Y luego quiero agregarlo a otra matriz NumPy (al igual que creamos una lista de listas). ¿Cómo creamos una matriz de matrices NumPy que contienen matrices NumPy?

Traté de hacer lo siguiente sin suerte

>>> M = np.array([])
>>> M
array([], dtype=float64)
>>> M.append(a,axis=0)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'append'
>>> a
array([1, 2, 3])
frazman
fuente
3
Puede crear una "matriz de matrices" (utiliza una matriz de objetos), pero definitivamente no desea hacerlo. ¿Que estás tratando de hacer? ¿Solo quieres una matriz 2d?
Joe Kington

Respuestas:

214
In [1]: import numpy as np

In [2]: a = np.array([[1, 2, 3], [4, 5, 6]])

In [3]: b = np.array([[9, 8, 7], [6, 5, 4]])

In [4]: np.concatenate((a, b))
Out[4]: 
array([[1, 2, 3],
       [4, 5, 6],
       [9, 8, 7],
       [6, 5, 4]])

o esto:

In [1]: a = np.array([1, 2, 3])

In [2]: b = np.array([4, 5, 6])

In [3]: np.vstack((a, b))
Out[3]: 
array([[1, 2, 3],
       [4, 5, 6]])
endolito
fuente
1
Hola, cuando ejecuto esto obtengo este np.concatenate ((a, b), axis = 1) Salida: array ([1, 2, 3, 2, 3, 4]) ¿Pero lo que estoy buscando es numpy 2d array? ?
frazman
3
@Fraz: agregué la vstack()idea de Sven . Sabes que puedes crear la matriz con array([[1,2,3],[2,3,4]]), ¿verdad?
endolito
concatenate () es el que necesitaba.
kakyo
1
numpy.vstackpuede aceptar más de 2 matrices en el argumento de secuencia. Por lo tanto, si necesita combinar más de 2 matrices, vstack es más útil.
ruhong
1
@oneleggedmule concatenatetambién puede tomar múltiples matrices
endolith
73

Bueno, el mensaje de error lo dice todo: las matrices NumPy no tienen un append()método. Sin numpy.append()embargo, hay una función gratuita :

numpy.append(M, a)

Esto creará una nueva matriz en lugar de mutar Men su lugar. Tenga en cuenta que usar numpy.append()implica copiar ambas matrices. Obtendrá un código de mejor rendimiento si utiliza matrices NumPy de tamaño fijo.

Sven Marnach
fuente
Hola ... cuando intento esto ... obtengo este >>> np.append (M, a) array ([1., 2., 3.]) >>> np.append (M, b) array ([ 2., 3., 4.]) >>> M array ([], dtype = float64) ¿Esperaba que M fuera un array 2D?
frazman
8
@Fraz: Echa un vistazo numpy.vstack().
Sven Marnach
Creo que esta debería ser la respuesta aceptada, ya que responde con precisión al punto.
Prasad Raghavendra
31

Puedes usar numpy.append()...

import numpy

B = numpy.array([3])
A = numpy.array([1, 2, 2])
B = numpy.append( B , A )

print B

> [3 1 2 2]

Esto no creará dos matrices separadas, sino que agregará dos matrices en una matriz dimensional única.

Zhai Zhiwei
fuente
10

Sven lo dijo todo, solo tenga mucho cuidado debido a los ajustes automáticos de tipo cuando se llama anexar.

In [2]: import numpy as np

In [3]: a = np.array([1,2,3])

In [4]: b = np.array([1.,2.,3.])

In [5]: c = np.array(['a','b','c'])

In [6]: np.append(a,b)
Out[6]: array([ 1.,  2.,  3.,  1.,  2.,  3.])

In [7]: a.dtype
Out[7]: dtype('int64')

In [8]: np.append(a,c)
Out[8]: 
array(['1', '2', '3', 'a', 'b', 'c'], 
      dtype='|S1')

Como puede ver en función del contenido, el dtype pasó de int64 a float32, y luego a S1

lukecampbell
fuente
7

Encontré este enlace mientras buscaba algo ligeramente diferente, cómo comenzar a agregar objetos de matriz a una matriz vacía vacía, pero probé todas las soluciones en esta página en vano.

Luego encontré esta pregunta y respuesta: Cómo agregar una nueva fila a una matriz vacía vacía

La esencia aquí:

La forma de "iniciar" la matriz que desea es:

arr = np.empty((0,3), int)

Luego puede usar concatenar para agregar filas de esta manera:

arr = np.concatenate( ( arr, [[x, y, z]] ) , axis=0)

Ver también https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

Clay Coleman
fuente
4

En realidad, siempre se puede crear una lista ordinaria de matrices numpy y convertirla más tarde.

In [1]: import numpy as np

In [2]: a = np.array([[1,2],[3,4]])

In [3]: b = np.array([[1,2],[3,4]])

In [4]: l = [a]

In [5]: l.append(b)

In [6]: l = np.array(l)

In [7]: l.shape
Out[7]: (2, 2, 2)

In [8]: l
Out[8]: 
array([[[1, 2],
        [3, 4]],

       [[1, 2],
        [3, 4]]])
Michael Ma
fuente
2

Tuve el mismo problema, y ​​no pude comentar sobre la respuesta de @Sven Marnach (no hay suficiente representante, Dios, recuerdo cuando Stackoverflow comenzó por primera vez ...) de todos modos.

Agregar una lista de números aleatorios a una matriz de 10 X 10.

myNpArray = np.zeros([1, 10])
for x in range(1,11,1):
    randomList = [list(np.random.randint(99, size=10))]
    myNpArray = np.vstack((myNpArray, randomList))
myNpArray = myNpArray[1:]

Usando np.zeros () se crea una matriz con 1 x 10 ceros.

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

Luego se crea una lista de 10 números aleatorios usando np.random y se asigna a randomList. El bucle lo apila 10 de altura. Solo tenemos que recordar eliminar la primera entrada vacía.

myNpArray

array([[31., 10., 19., 78., 95., 58.,  3., 47., 30., 56.],
       [51., 97.,  5., 80., 28., 76., 92., 50., 22., 93.],
       [64., 79.,  7., 12., 68., 13., 59., 96., 32., 34.],
       [44., 22., 46., 56., 73., 42., 62.,  4., 62., 83.],
       [91., 28., 54., 69., 60., 95.,  5., 13., 60., 88.],
       [71., 90., 76., 53., 13., 53., 31.,  3., 96., 57.],
       [33., 87., 81.,  7., 53., 46.,  5.,  8., 20., 71.],
       [46., 71., 14., 66., 68., 65., 68., 32.,  9., 30.],
       [ 1., 35., 96., 92., 72., 52., 88., 86., 94., 88.],
       [13., 36., 43., 45., 90., 17., 38.,  1., 41., 33.]])

Entonces en una función:

def array_matrix(random_range, array_size):
    myNpArray = np.zeros([1, array_size])
    for x in range(1, array_size + 1, 1):
        randomList = [list(np.random.randint(random_range, size=array_size))]
        myNpArray = np.vstack((myNpArray, randomList))
    return myNpArray[1:]

una matriz de 7 x 7 usando números aleatorios 0 - 1000

array_matrix(1000, 7)

array([[621., 377., 931., 180., 964., 885., 723.],
       [298., 382., 148., 952., 430., 333., 956.],
       [398., 596., 732., 422., 656., 348., 470.],
       [735., 251., 314., 182., 966., 261., 523.],
       [373., 616., 389.,  90., 884., 957., 826.],
       [587., 963.,  66., 154., 111., 529., 945.],
       [950., 413., 539., 860., 634., 195., 915.]])
Ala
fuente
1

Si entiendo tu pregunta, aquí hay una manera. Digamos que tienes:

a = [4.1, 6.21, 1.0]

Así que aquí hay un código ...

def array_in_array(scalarlist):
    return [(x,) for x in scalarlist]

Lo que lleva a:

In [72]: a = [4.1, 6.21, 1.0]

In [73]: a
Out[73]: [4.1, 6.21, 1.0]

In [74]: def array_in_array(scalarlist):
   ....:     return [(x,) for x in scalarlist]
   ....: 

In [75]: b = array_in_array(a)

In [76]: b
Out[76]: [(4.1,), (6.21,), (1.0,)]
linhares
fuente
0

Prueba este código:

import numpy as np

a1 = np.array([])

n = int(input(""))

for i in range(0,n):
    a = int(input(""))
    a1 = np.append(a, a1)
    a = 0

print(a1)

También puede usar una matriz en lugar de "a"

Mehdi
fuente