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])
Frazman
fonte
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]])
endólito
fonte
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.

Sven Marnach
fonte
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.

Zhai Zhiwei
fonte
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

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

Clay Coleman
fonte
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]]])
Michael Ma
fonte
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.]])
Asa
fonte
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,)]
linhares
fonte
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"

Mehdi
fonte