Convierta una matriz 1D en una matriz 2D en numpy

118

Quiero convertir una matriz unidimensional en una matriz bidimensional especificando el número de columnas en la matriz 2D. Algo que funcionaría así:

> 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 tiene una función que funciona como mi función inventada "vec2matrix"? (Entiendo que puede indexar una matriz 1D como una matriz 2D, pero esa no es una opción en el código que tengo, necesito hacer esta conversión).

Alex Williams
fuente

Respuestas:

163

Quieres reshapela matriz.

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

donde -1infiere el tamaño de la nueva dimensión del tamaño de la matriz de entrada.

Matt Ball
fuente
44

Tienes dos opciones:

  • Si ya no desea la forma original, lo más fácil es simplemente asignar una nueva forma a la matriz

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

    Puede alternar a.size//ncolsentre -1para calcular la forma adecuada automáticamente. Asegúrese de eso a.shape[0]*a.shape[1]=a.size, de lo contrario se encontrará con algún problema.

  • Puede obtener una nueva matriz con la np.reshapefunción, que funciona principalmente como la versión presentada anteriormente

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

    Cuando sea posible, newserá solo una vista de la matriz inicial a, lo que significa que los datos se comparten. En algunos casos, sin embargo, la newmatriz será una copia. Tenga en cuenta que np.reshapetambién acepta una palabra clave opcional orderque le permite cambiar del orden C de la fila principal al orden Fortran de la columna principal. np.reshapees la versión de función del a.reshapemétodo.

Si no puede respetar el requisito a.shape[0]*a.shape[1]=a.size, tendrá que crear una nueva matriz. Puede usar la np.resizefunción y mezclarla con np.reshape, como

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

Prueba algo como:

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

Sin ncolsembargo, deberá asegurarse de poder dividir el número de elementos en su matriz . También puede jugar con el orden en el que se introducen los números Butilizando la orderpalabra clave.

JoshAdel
fuente
4

Si su único propósito es convertir una matriz 1d X en una matriz 2d, simplemente haga:

X = np.reshape(X,(1, X.size))
Arun
fuente
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
fuente
1
Es mejor que incluya alguna explicación junto con el código.
Sid
¿Puede explicar cómo su respuesta ahora es diferente de la anterior y también de las otras respuestas anteriores, que también usa np.reshape?
StupidWolf
0
some_array.shape = (1,)+some_array.shape

o consigue uno nuevo

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

Esto hará que las dimensiones sean +1, lo que equivale a agregar un corchete en el extremo

ZDL-so
fuente
-1

Puede usar flatten()desde el paquete 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}")

Salida:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]
Rafi
fuente
AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F
1
¿Podrías compartir tu código? Porque el numpy seguro tiene flattenmétodo: docs.scipy.org/doc/numpy/reference/generated/…
Rafi
-2

Cambie la matriz 1D en matriz 2D sin 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
fuente