Adicione um único elemento à matriz em numpy

122

Eu tenho uma matriz numpy contendo:

[1, 2, 3]

Eu quero criar um array contendo:

[1, 2, 3, 1]

Ou seja, quero adicionar o primeiro elemento ao final da matriz.

Eu tentei o óbvio:

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

Mas recebo um erro dizendo ValueError: arrays must have same number of dimensions

Eu não entendo isso - os arrays são apenas arrays 1d.

robintw
fonte
1
np.insert([1,2,3], 3, 1)
Sparkler

Respostas:

163

append() cria uma nova matriz que pode ser a antiga com o elemento anexado.

Acho que é mais normal usar o método adequado para adicionar um elemento:

a = numpy.append(a, a[0])
Steabert
fonte
29
Este comando não altera o aarray. No entanto, ele retorna uma nova matriz modificada. Portanto, se a a modificação for necessária, a = numpy.append(a,a[0])deve ser usada.
Amjad
np.appendusa np.concatenate. Isso apenas garante que o addon tenha uma dimensão. O erro OP foi o a[0]tem 0 dimensões.
hpaulj
Por que anexar cria uma nova matriz se eu só quiser adicionar um elemento?
ed22 de
Não gosto do fato de precisarmos chamar outra função para um comando tão simples. Seria melhor se houvesse um método interno no próprio array como a.append(1), a.add(1)ou mesmo algo análogo a listas comoa + [1]
Fernando Wittmann
17

Ao anexar apenas uma vez ou uma vez de vez em quando, usar np.appendem seu array deve ser suficiente. A desvantagem dessa abordagem é que a memória é alocada para um array completamente novo sempre que é chamado. Ao aumentar um array para uma quantidade significativa de amostras, seria melhor pré-alocar o array (se o tamanho total for conhecido) ou anexar a uma lista e converter em um array posteriormente.

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 a lista python e convertendo para array posteriormente:

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)

Matriz numpy pré-alocada:

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)

Quando o tamanho final é desconhecido, a pré-alocação é difícil, tentei pré-alocar em blocos de 50, mas não cheguei perto de usar uma lista.

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

a[0]não é um array, é o primeiro elemento de ae, portanto, não tem dimensões.

Tente usar a[0:1], que retornará o primeiro elemento de adentro de uma única matriz de item.

DMA57361
fonte
12

Experimente isto:

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

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

concatenate precisa que ambos os elementos sejam arrays entorpecidos; entretanto, a [0] não é uma matriz. É por isso que não funciona.

leitor_1000
fonte
Ou, mais simplesmente np.concatenate((a, [a[0]])). A lista será promovida a um tipo de array automaticamente de qualquer maneira, economizando um pouco de digitação.
Mad Physicist
10

Este comando,

numpy.append(a, a[0])

não altera a amatriz. No entanto, ele retorna uma nova matriz modificada. Portanto, se a amodificação for necessária, o seguinte deve ser usado.

a = numpy.append(a, a[0])
Amjad
fonte
7
t = np.array([2, 3])
t = np.append(t, [4])
user2804741
fonte
3

Isso pode ser um pouco exagero, mas eu sempre uso a np.takefunção para qualquer indexação abrangente:

>>> 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
fonte
2

Digamos a=[1,2,3]e você quer que seja [1,2,3,1].

Você pode usar a função incorporada de acréscimo

np.append(a,1)

Aqui, 1 é um int, pode ser uma string e pode ou não pertencer aos elementos da matriz. Impressões:[1,2,3,1]

Nandan Kulkarni
fonte
Bem-vindo ao StackOverflow! Você pode querer ler este guia sobre como formatar código e, em seguida, atualizar sua resposta para que seja mais legível :) Além disso, esta é uma pergunta muito antiga com uma resposta aceita, melhor responder algumas novas
0mpurdy
0

Se você quiser adicionar um elemento, use append()

a = numpy.append(a, 1) neste caso, adicione o 1 no final da matriz

Se você deseja inserir um elemento, use insert()

a = numpy.insert(a, index, 1) neste caso, você pode colocar 1 onde desejar, usando o índice para definir a posição na matriz.

adejonghm
fonte