2015-10-29 2 views
2

Это может быть очень глупый вопрос, но я боролся с ним и не мог найти его в документации.преобразование вектора numpy в cvxopt

Я пытаюсь выполнить квадратичное программирование с помощью description given here. documentation here охватывает только преобразование 2-мерных массивов numpy в массивы cvxopt, а не одномерные массивы numpy.

Я попытался преобразовать 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 

Во всех случаях я получаю ответ TypeError: buffer format not supported.

Однако, матрица numpy, похоже, работает нормально, например.

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

Если я пытаюсь запустить оптимизацию без преобразования Numpy вектора cvxopt формат, как это:

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

Я получаю сообщение об ошибке: TypeError 'q' must be a 'd' matrix with one column.

Что может быть правильным способом преобразования вектора numpy в матрицу cvxopt с одним столбцом?

+0

Связанный: https://stackoverflow.com/questions/12551009/python3-conversion-between-cvxopt-matrix-and-numpy-array/45933678#45933678 –

ответ

4

Вы не указали данные образца, но когда я столкнулся с этой ошибкой, это было из-за dtype.

попробовать:

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

CVX принимает только двойники, а не INTS.

+0

Строго говоря, это 'cvxopt.qp' решатель, который требует двойные поплавки для всех его аргументов. Сам CVXOPT поддерживает целочисленные матрицы ('cvxopt.matrix (np.arange (5))' будет возвращать целочисленную матрицу с typecode ''i''). –

+0

это право. Я узнал позже по той же причине. – uday

Смежные вопросы