Anexar uma matriz NumPy a uma matriz NumPy


178

Eu tenho um numpy_array. Algo como [ a b c ].

E então eu quero anexá-lo em outra matriz NumPy (assim como criamos uma lista de listas). Como criamos uma matriz de matrizes NumPy contendo matrizes NumPy?

Eu tentei fazer o seguinte sem sorte

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

3
Você pode criar uma "matriz de matrizes" (você usa uma matriz de objetos), mas quase definitivamente não deseja. O que você está tentando fazer? Você só quer uma matriz 2D?
Joe Kington

Respostas:


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

ou isto:

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

1
Oi quando eu executo isso, recebo este np.concatenate ((a, b), axis = 1) Output: array ([1, 2, 3, 2, 3, 4]) Mas o que estou procurando é um array 2D numpy? ?
frazman

3
@Fraz: Adicionei a vstack()ideia de Sven . Você sabe que pode criar a matriz com array([[1,2,3],[2,3,4]]), certo?
endolith 19/03/12

concatenate () é o que eu precisava.
kakyo

1
numpy.vstackpode aceitar mais de 2 matrizes no argumento de sequência. Portanto, se você precisar combinar mais de 2 matrizes, o vstack será mais útil.
ruhong

1
@oneleggedmule concatenatetambém pode tomar várias matrizes
endolith

73

Bem, a mensagem de erro diz tudo: matrizes NumPy não têm um append()método. Existe uma função livre numpy.append()no entanto:

numpy.append(M, a)

Isso criará uma nova matriz em vez de mudar Mno local. Observe que o uso numpy.append()envolve copiar as duas matrizes. Você obterá um código com melhor desempenho se usar matrizes NumPy de tamanho fixo.


Oi .. quando eu tento isso .. Eu recebo este >>> np.append (M, a) array ([1., 2., 3.]) >>> np.append (M, b) array ([ 2., 3., 4.]) >>> matriz M ([], dtype = float64) Eu esperava que M fosse uma matriz 2D ??
frazman

8
@Fraz: Dê uma olhada numpy.vstack().
Sven Marnach 19/03/12

Eu acho que essa deve ser a resposta aceita, pois responde exatamente ao ponto.
Prasad Raghavendra 27/03

31

Você pode 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]

Isso não criará duas matrizes separadas, mas anexará duas matrizes em uma matriz dimensional única.


10

Sven disse tudo, apenas tenha muito cuidado por causa dos ajustes automáticos de tipo quando o acréscimo é chamado.

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 você vê, com base no conteúdo, o dtype passou de int64 para float32 e depois para S1


7

Eu encontrei esse link enquanto procurava algo um pouco diferente, como começar a acrescentar objetos de matriz a uma matriz numpy vazia , mas tentei todas as soluções nesta página sem sucesso.

Então eu encontrei esta pergunta e resposta: Como adicionar uma nova linha a uma matriz numpy vazia

A essência aqui:

A maneira de "iniciar" a matriz que você deseja é:

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

Em seguida, você pode usar concatenar para adicionar linhas da seguinte maneira:

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

Veja também https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html


4

Na verdade, sempre é possível criar uma lista comum de matrizes numpy e convertê-la mais 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]]])

2

Eu tive o mesmo problema e não pude comentar a resposta de @Sven Marnach (repetição insuficiente, Deus me lembro quando o Stackoverflow começou ...) de qualquer maneira.

Adicionando uma lista de números aleatórios a uma matriz 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 (), uma matriz é criada com 1 x 10 zeros.

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

Em seguida, uma lista de 10 números aleatórios é criada usando np.random e atribuída a randomList. O loop empilha 10 alta. Só precisamos lembrar de remover a primeira entrada vazia.

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

Então, em uma função:

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

uma matriz 7 x 7 usando números aleatórios 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.]])

1

Se eu entendi sua pergunta, aqui está uma maneira. Digamos que você tenha:

a = [4.1, 6.21, 1.0]

então aqui está um código ...

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

O que leva 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,)]

0

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

Além disso, você pode usar a matriz em vez de "a"

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.