给定一个Pandas数据帧,转换为cvxopt矩阵的最佳方式(可读性或执行速度)是什么?反之亦然?
目前我在做:
cvxMat = matrix(pdObj.as_matrix())
pdObj[:]=np.array(cvxMat)
此外,使用cvxopt矩阵和pandas数据帧的混合物进行矢量或矩阵代数是否有合理可读的方法而不转换对象?
以下是一个远非可读的矢量点积(pdObj& cvxMat是列向量):
(matrix(pdObj.as_matrix()).T*cvxMat)[0]
有什么建议吗?
仅用于说明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]
答案 0 :(得分:1)
您可以通过pdObj.values
你可以直接在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]])
答案 1 :(得分:1)
搞乱cvxopt __init__的另一种方法是定义自己的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数组和vecs - 另外一个问题。)