将numpy向量转换为cvxopt

uda*_*day 2 python numpy cvxopt

这可能是一个非常愚蠢的问题,但我一直在努力,并且在文档中找不到它.

我正在尝试使用此处给出描述进行二次规划.这里文档仅涵盖了将2维numpy数组转换为cvxopt数组,而不是1维numpy数组.

q的目标函数(1/2)x' P x + q' x向量是一个numpy向量,比如大小n.

我尝试q通过以下方式从numpy 转换为cvxopt:

import cvxopt as cvx
cvx_q = cvx.matrix(q)   # didn't work
cvx_q = cvx.matrix(q, (n, 1)) # didn't work
cvx_q = cvx.matrix(np.array([q])) # didn't work
cvx_q = cvx.matrix(np.array([q]), (1, n)) # didn't work
cvx_q = cvx.matrix(np.array([q]), (n, 1)) # didn't work
Run Code Online (Sandbox Code Playgroud)

在所有情况下,我都会得到答案TypeError: buffer format not supported.

然而,numpy矩阵似乎工作正常,例如

cvx_p = cvx.matrix(p)   # works fine, p is a n x n numpy matrix
Run Code Online (Sandbox Code Playgroud)

如果我尝试运行优化而不将numpy向量转换为cvxopt格式,如下所示:

cvxs.qp(cvx_p, cvx_q, cvx_g, cvx_h, cvx_a, cvx_b)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:TypeError 'q' must be a 'd' matrix with one column.

将numpy向量转换为带有一列的cvxopt矩阵的正确方法是什么?

Chr*_*ris 5

您没有包含任何示例数据,但是当我遇到此错误时,这是​​因为dtype.

尝试:

q = q.astype(np.double)
cvx_q = matrix(q)
Run Code Online (Sandbox Code Playgroud)

CVX只接受双打,而不是整数.