Pandas: 转换到/从cvxopt矩阵
给定一个Pandas数据框,最好的方法是什么(无论是可读性还是执行速度)来转换成cvxopt矩阵,或者反过来?
目前我正在这样做:
cvxMat = matrix(pdObj.as_matrix())
pdObj[:]=np.array(cvxMat)
另外,有没有一种比较容易理解的方法,可以在不转换对象的情况下,使用cvxopt矩阵和pandas数据框进行向量或矩阵运算?
下面是一个向量点积的例子(pdObj和cvxMat都是列向量),但这个写法看起来不太容易理解:
(matrix(pdObj.as_matrix()).T*cvxMat)[0]
有什么建议吗?
对waitingkuo回答的后续补充:
仅仅是为了用pandas数据框做个示例:
>>> m1 = cvxopt.matrix([[1, 2, 3], [2, 3, 4]])
>>> m2 = pd.DataFrame(np.array(m1)).T
>>> m1
<3x2 matrix, tc='i'>
>>> m2.shape
(2, 3)
>>> np.dot(m1,m2)
array([[ 5, 8, 11],
[ 8, 13, 18],
[11, 18, 25]])
但请注意:
>>> m1 * m2
0 1 2
0 1 4 9
1 4 9 16
[2 rows x 3 columns]
2 个回答
1
一个不需要去修改 cvxopt 的方法是自己定义一个 dot
函数;
A 或 B 可以是 numpy 数组,或者类似数组的东西,或者任何有 .value
或 .values
属性的对象:
def dot( A, B ):
""" np.dot .value or .values if they exist """
for val in "value values" .split():
A = getattr( A, val, A ) # A.val or A
B = getattr( B, val, B )
A = np.asanyarray( A )
B = np.asanyarray( B )
try:
np.dot( A, B )
except ValueError:
print >>sys.stderr, "error: can't dot shapes %s x %s" % (A.shape, B.shape)
raise
顺便说一下,我不使用矩阵,只用 numpy 数组和向量——这是另一个话题。
2
你可以通过 pdObj.values
从 pandas 中获取 numpy 数组。
你可以直接在 cvxopt 矩阵和 numpy 矩阵之间进行矩阵乘法运算。
In [90]: m1 = cvxopt.matrix([[1, 2, 3], [2, 3, 4]])
In [91]: m2 = np.matrix([[1, 2, 3], [2, 3, 4]])
In [92]: m1
Out[92]: <3x2 matrix, tc='i'>
In [94]: m2.shape
Out[94]: (2, 3)
In [95]: m1 * m2
Out[95]:
matrix([[ 5, 8, 11],
[ 8, 13, 18],
[11, 18, 25]])