Python3中cvxopt.matrix和numpy.array之间的转换

4

Python: Python3.2 CVXOPT: 1.1.5 NumPy: 1.6.1

我阅读了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]]))

我获得了

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

通过np.array(cvxopt.matrix([[7, 8, 9], [10, 11, 12]])),我得到了:

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

4
我认为这是一个漏洞。你的代码在Python 2.7中运行良好(如你提到的教程所述)。我建议你去cvxopt讨论论坛提问(http://groups.google.com/forum/?fromgroups#!forum/cvxopt)。 - Vicent
2
当调用numpy.array时,您可以尝试强制使用dtype=float - Pierre GM
@PierreGM 刚刚尝试了一下,不起作用 :-( . - updogliu
3个回答

4
截至目前,当使用cvxopt == 1.2.6numpy == 1.21.2时:
import cvxopt
import numpy as np

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

生成输出:
[  7   8   9]
[ 10  11  12]

print(repr(matrix))的输出结果:

<2x3 matrix, tc='i'>

并且print(type(matrix)) 显示:

<class 'cvxopt.base.matrix'>

由于起始的numpy数组包含整数,因此生成的矩阵具有整数类型('i')。如果使用double作为起始值,则会得到'd'类型。


2

虽然这个问题还没有被修复,但我们可以采用一个简单的解决方法:

cvxopt.matrix(nparray)

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

对于相反的方向,这更加困难。如果你期望一个 int 数组,

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

对于双数组:

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

2

请查看我在cvxopt讨论论坛上发布的修补后的dense.c文件(https://groups.google.com/forum/?fromgroups=#!topic/cvxopt/9jWnkbJvk54)。使用这个版本重新编译,你就可以将np数组转换为密集矩阵。我认为对于稀疏矩阵也需要类似的修改,但是由于我不需要它们,所以我将把这个工作交给开发人员。


修补后的dense.c仅在从numpy.array转换为cvxopt.matrix时有效,反之则无效。 - user1069152

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接