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

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.


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)

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.


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

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)

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


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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.