2

给定一个 Pandas 数据框,转换为 cvxopt 矩阵的最佳方式(可读性或执行速度)是什么,反之亦然?

目前我正在做:

cvxMat = matrix(pdObj.as_matrix())
pdObj[:]=np.array(cvxMat)

此外,是否有一种在不转换对象的情况下使用 cvxopt 矩阵和 pandas 数据帧的混合来进行向量或矩阵代数的合理可读的方法?

下面是一个远不可读的向量点积(pdObj & cvxMat 是列向量):

(matrix(pdObj.as_matrix()).T*cvxMat)[0]

有什么建议吗?


对waitkuo的回答的跟进:

仅用于说明熊猫数据框:

>>> 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]
4

2 回答 2

1

您可以通过以下方式从 pandas 获取 numpy 数组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]]) 
于 2014-04-15T08:54:04.260 回答
1

与 cvxopt __init__ 混淆的另一种方法是定义自己的dot;
A 或 B 可以是 numpy 数组,或类似数组,或任何带有.valueor的东西.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 - 一个单独的问题。)

于 2014-04-15T14:40:51.390 回答