提问者:小点点

将numpy向量转换为cvxop


这可能是一个非常傻的问题,但我一直在纠结,留档也没能轻易找到。

我正在尝试使用这里给出的描述进行二次编程。这里的留档仅涵盖将2维numpy数组转换为cvxop数组,而不是1维numpy数组。

我的目标函数(1/2)x'P x q'xq向量是一个numpy向量,比如说sizen

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

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

在所有情况下,我都会得到答案TypeError:不支持缓冲区格式

然而,numpy矩阵似乎工作得很好,例如。

cvx_p = cvx.matrix(p)   # works fine, p is a n x n numpy matrix

如果我尝试在不将numpy向量转换为cvxop格式的情况下运行优化,如下所示:

cvxs.qp(cvx_p, cvx_q, cvx_g, cvx_h, cvx_a, cvx_b)

我收到一个错误:TypeError'q'必须是一列的'd'矩阵

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


共2个答案

匿名用户

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

尝试:

q = q.astype(np.double)
cvx_q = matrix(q)

CVX只接受双打,不接受整数。

匿名用户

其中一个关键错误是您假设CVX接受int,这是不正确的。CVX只接受双精度。所以,正确的方法可能是:

import cvxopt as cp
if not isinstance(q, np.double): 
  q.astype(np.double)
cvx_q = cp.matrix(q)