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.

robintw
fuente
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])
Steabert
fuente
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)
Jurgen Strydom
fuente
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.

DMA57361
fuente
12

Prueba esto:

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

http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

concatenar necesita que ambos elementos sean matrices numerosas; sin embargo, un [0] no es una matriz. Por eso no funciona.

reader_1000
fuente
O más simplemente np.concatenate((a, [a[0]])). La lista se promoverá automáticamente a un tipo de matriz de todos modos, lo que le ahorrará algo de escritura.
Mad Physicist
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])
Amjad
fuente
7
t = np.array([2, 3])
t = np.append(t, [4])
usuario2804741
fuente
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])
Simon Streicher
fuente
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]

Nandan Kulkarni
fuente
¡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.

adejonghm
fuente