Conversión de python3 entre cvxopt.matrix y numpy.array

python: python3.2 cvxopt: 1.1.5 numpy: 1.6.1

Leí http://abel.ee.ucla.edu/cvxopt/examples/tutorial/numpy.html

import cvxopt import numpy as np cvxopt.matrix(np.array([[7, 8, 9], [10, 11, 12]])) 

tengo

 Traceback (most recent call last): File "", line 1, in  TypeError: non-numeric element in list 

Por np.array(cvxopt.matrix([[7, 8, 9], [10, 11, 12]])) , obtuve

 array([[b'\x07', b'\n'], [b'\x08', b'\x0b'], [b'\t', b'\x0c']], dtype='|S8') 

Compruebe el dense.c parcheado que instalé en el foro de discusión cvxopt ( https://groups.google.com/forum/?fromgroups=#!topic/cvxopt/9jWnkbJvk54 ). Comstack con esto, y podrás convertir np arrays a matrices densas. Asumo que el mismo tipo de ediciones serán necesarias para matrices dispersas, pero como no las necesito, las dejaré en manos de los desarrolladores.

A partir de cvxopt == 1.1.9 y numpy == 1.13.1 :

 import cvxopt import numpy as np a = cvxopt.matrix(np.array([[7, 8, 9], [10, 11, 12]])) print(a) 

produce la salida

 [ 7 8 9] [ 10 11 12] 

y a es un

 <2x3 matrix, tc='i'> 

La matriz resultante tiene un tipo de entero ( la 'i' ) porque la matriz numpy inicial contenía enteros. Comenzando con double resultados en un tipo 'd' .

Si bien no es fijo, una solución simple para

 cvxopt.matrix(nparray) 

es

 cvxopt.matrix(nparray.T.tolist()) 

Es más resistente para la dirección opuesta. Si esperas int array,

 np.vectorize(lambda x: int.from_bytes(x, 'big'))(np.array(cvxoptmat).T) 

Para la matriz doble:

 import struct np.vectorize(lambda x: struct.unpack('d', x))(np.array(cvxoptmat).T)