Converta uma matriz 1D em uma matriz 2D em numpy

118

Quero converter uma matriz unidimensional em uma matriz bidimensional, especificando o número de colunas na matriz 2D. Algo que funcionasse assim:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

Numpy tem uma função que funciona como minha função inventada "vec2matrix"? (Eu entendo que você pode indexar uma matriz 1D como uma matriz 2D, mas isso não é uma opção no código que tenho - preciso fazer essa conversão.)

Alex Williams
fonte

Respostas:

163

Você quer reshapea matriz.

B = np.reshape(A, (-1, 2))

onde -1infere o tamanho da nova dimensão a partir do tamanho da matriz de entrada.

Matt Ball
fonte
44

Você tem duas opções:

  • Se você não quiser mais a forma original, o mais fácil é apenas atribuir uma nova forma à matriz

    a.shape = (a.size//ncols, ncols)

    Você pode alternar o a.size//ncolspor -1para calcular a forma adequada automaticamente. Certifique-se disso a.shape[0]*a.shape[1]=a.size, senão você terá algum problema.

  • Você pode obter um novo array com a np.reshapefunção, que funciona principalmente como a versão apresentada acima

    new = np.reshape(a, (-1, ncols))

    Quando for possível, newserá apenas uma visualização do array inicial a, significando que os dados são compartilhados. Em alguns casos, porém, o newarray será uma cópia. Observe que np.reshapetambém aceita uma palavra-chave opcional orderque permite alternar da ordem C principal da linha para a ordem Fortran principal da coluna. np.reshapeé a versão da função do a.reshapemétodo.

Se você não puder respeitar o requisito a.shape[0]*a.shape[1]=a.size, terá que criar um novo array. Você pode usar a np.resizefunção e misturá-la np.reshape, como

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)
Pierre GM
fonte
9

Experimente algo como:

B = np.reshape(A,(-1,ncols))

Você precisa ter certeza de que pode dividir o número de elementos em seu array por ncols. Você também pode brincar com a ordem em que os números são puxados Busando a orderpalavra - chave.

JoshAdel
fonte
4

Se o seu único propósito é converter um array 1d X em um array 2d, basta fazer:

X = np.reshape(X,(1, X.size))
Uma corrida
fonte
0
import numpy as np
array = np.arange(8) 
print("Original array : \n", array)
array = np.arange(8).reshape(2, 4)
print("New array : \n", array)
Ayush Kapri
fonte
1
É melhor que você inclua alguma explicação junto com o código.
Sid
Você pode explicar como sua resposta agora é diferente da anterior e também das outras respostas acima, que também usam np.reshape?
StupidWolf
0
some_array.shape = (1,)+some_array.shape

ou pegue um novo

another_array = numpy.reshape(some_array, (1,)+some_array.shape)

Isso tornará as dimensões +1, igual a adicionar um colchete na parte externa

ZDL-so
fonte
-1

Você pode usar flatten()do pacote numpy.

import numpy as np
a = np.array([[1, 2],
       [3, 4],
       [5, 6]])
a_flat = a.flatten()
print(f"original array: {a} \nflattened array = {a_flat}")

Resultado:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]
Rafi
fonte
AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F
1
Você poderia compartilhar seu código? Porque o numpy com certeza tem flattenmétodo: docs.scipy.org/doc/numpy/reference/generated/…
Rafi
-2

Mude o array 1D para o array 2D sem usar Numpy.

l = [i for i in range(1,21)]
part = 3
new = []
start, end = 0, part


while end <= len(l):
    temp = []
    for i in range(start, end):
        temp.append(l[i])
    new.append(temp)
    start += part
    end += part
print("new values:  ", new)


# for uneven cases
temp = []
while start < len(l):
    temp.append(l[start])
    start += 1
    new.append(temp)
print("new values for uneven cases:   ", new)
Ayush Kapri
fonte