2012-09-25 35 views
48

Quiero convertir una matriz de 1 dimensión en una matriz especificando el número de columnas en la matriz. Algo que podría funcionar así:Convertir una matriz 1D en una matriz 2D en numpy

> 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], 
    [7, 8]]) 

¿Tiene numpy tienen una función que funciona como mi función maquillada "vec2matrix"? (Entiendo que puede indexar una matriz 1D como una matriz, pero esa no es una opción en el código que tengo - Necesito hacer esta conversión)

Respuesta

67

Quiere reshape la matriz.

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

Pruebe algo como:

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

Tendrá que asegurarse de que se puede dividir el número de elementos en la matriz por ncols sin embargo. También puede jugar con el orden en el que se extraen los números en B utilizando la palabra clave order.

26

tiene dos opciones:

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

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

    Puede cambiar el a.size//ncols por -1 para calcular la forma correcta automáticamente. Asegúrese de que a.shape[0]*a.shape[1]=a.size, de lo contrario se encontrará con algún problema.

  • Usted puede obtener una nueva matriz con la función np.reshape, que funciona sobre todo como la versión presentada anteriormente

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

    Cuando es posible, new habrá sólo una vista de la matriz inicial a, lo que significa que la los datos son compartidos En algunos casos, sin embargo, el arreglo new será en su lugar acopy. Tenga en cuenta que np.reshape también acepta una palabra clave opcional order que le permite cambiar del orden C de fila mayor al orden de Fortran de columna mayor. np.reshape es la versión de función del método a.reshape.

Si no puede respetar el requisito a.shape[0]*a.shape[1]=a.size, le pegan con tener que crear una nueva matriz. Puede utilizar la función np.resize y mezclarlo con np.reshape, como

>>> a =np.arange(9) 
>>> np.resize(a, 10).reshape(5,2) 
+2

respuesta completa! ¡Este debería ser el aceptado! – gota

Cuestiones relacionadas