Agregue un solo elemento a la matriz en numpy


122

Tengo una matriz numpy que contiene:

[1, 2, 3]

Quiero crear una matriz que contenga:

[1, 2, 3, 1]

Es decir, quiero agregar el primer elemento al final de la matriz.

He intentado lo obvio:

np.concatenate((a, a[0]))

Pero me sale un error diciendo ValueError: arrays must have same number of dimensions

No entiendo esto: las matrices son solo matrices 1d.


1
np.insert([1,2,3], 3, 1)
Bengala

Respuestas:


163

append() crea una nueva matriz que puede ser la matriz anterior con el elemento agregado.

Creo que es más normal usar el método adecuado para agregar un elemento:

a = numpy.append(a, a[0])

29
Este comando no altera la amatriz. Sin embargo, devuelve una nueva matriz modificada. Por lo tanto, si a se requiere una modificación, se a = numpy.append(a,a[0])debe utilizar.
Amjad

np.appendutiliza np.concatenate. Solo se asegura de que el complemento tenga una dimensión. El error OP fue que a[0]tiene 0 dimensiones.
hpaulj

¿Por qué agregar crea una matriz completamente nueva si solo quiero agregar un elemento?
ed22

No me gusta el hecho de que necesitemos llamar a otra función para un comando tan simple. Sería mejor si hubiera un método interno en la matriz como a.append(1), a.add(1)o incluso algo análogo a listas comoa + [1]
Fernando Wittmann

17

Al agregar solo una o una vez de vez en cuando, usar np.appenden su matriz debería estar bien. El inconveniente de este enfoque es que la memoria se asigna para una matriz completamente nueva cada vez que se llama. Al cultivar una matriz para una cantidad significativa de muestras, sería mejor preasignar la matriz (si se conoce el tamaño total) o agregarla a una lista y convertirla en una matriz después.

Usando np.append:

b = np.array([0])
for k in range(int(10e4)):
    b = np.append(b, k)
1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Usando la lista de Python convirtiendo a una matriz después:

d = [0]
for k in range(int(10e4)):
    d.append(k)
f = np.array(d)
13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Preasignación de matriz numpy:

e = np.zeros((n,))
for k in range(n):
    e[k] = k
9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Cuando se desconoce el tamaño final, la asignación previa es difícil, intenté realizar la asignación previa en partes de 50, pero no se acercó a usar una lista.

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

14

a[0]no es una matriz, es el primer elemento de ay, por lo tanto, no tiene dimensiones.

Intente usar en su a[0:1]lugar, que devolverá el primer elemento adentro de una matriz de un solo elemento.



10

Este comando,

numpy.append(a, a[0])

no altera la amatriz. Sin embargo, devuelve una nueva matriz modificada. Por lo tanto, si ase requiere una modificación, se debe utilizar lo siguiente.

a = numpy.append(a, a[0])


3

Esto puede ser un poco exagerado, pero siempre uso la np.takefunción para cualquier indexación envolvente:

>>> a = np.array([1, 2, 3])
>>> np.take(a, range(0, len(a)+1), mode='wrap')
array([1, 2, 3, 1])

>>> np.take(a, range(-1, len(a)+1), mode='wrap')
array([3, 1, 2, 3, 1])

2

Digamos a=[1,2,3]y quieres que sea [1,2,3,1].

Puede utilizar la función de adición incorporada

np.append(a,1)

Aquí 1 es un int, puede ser una cadena y puede pertenecer o no a los elementos de la matriz. Huellas dactilares:[1,2,3,1]


¡Bienvenido a StackOverflow! Es posible que desee leer esta guía sobre cómo formatear el código y luego actualizar su respuesta para que sea más legible :) Además, esta es una pregunta muy antigua con una respuesta aceptada, es mejor responder algunas nuevas
0mpurdy

0

Si desea agregar un elemento, use append()

a = numpy.append(a, 1) en este caso agregue el 1 al final de la matriz

Si desea insertar un elemento, use insert()

a = numpy.insert(a, index, 1) en este caso, puede poner el 1 donde desee, utilizando index para establecer la posición en la matriz.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.