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.


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])

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)

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.



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])


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])

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]


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.