【问题标题】:python3 conversion between cvxopt.matrix and numpy.arraycvxopt.matrix和numpy.array之间的python3转换
【发布时间】:2012-09-23 09:01:01
【问题描述】:

python:python3.2 cvxopt:1.1.5 numpy:1.6.1

我读过http://abel.ee.ucla.edu/cvxopt/examples/tutorial/numpy.html

import cvxopt
import numpy as np
cvxopt.matrix(np.array([[7, 8, 9], [10, 11, 12]]))

我明白了

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: non-numeric element in list

np.array(cvxopt.matrix([[7, 8, 9], [10, 11, 12]])),我得到了

array([[b'\x07', b'\n'],
   [b'\x08', b'\x0b'],
   [b'\t', b'\x0c']], 
  dtype='|S8')

【问题讨论】:

  • 我认为这是一个错误。您的代码适用于 python 2.7(如您提到的教程中所述)。我建议你去 cvxopt 论坛(groups.google.com/forum/?fromgroups#!forum/cvxopt)提问。
  • 你可以尝试在调用numpy.array时强制dtype=float..
  • @PierreGM 刚试过。没用 :-( .

标签: python numpy python-3.x


【解决方案1】:

截至cvxopt == 1.2.6numpy == 1.21.2

import cvxopt
import numpy as np

matrix = cvxopt.matrix(np.array([[7, 8, 9], [10, 11, 12]]))
print(matrix)

产生输出:

[  7   8   9]
[ 10  11  12]

print(repr(matrix)) 说:

<2x3 matrix, tc='i'>

print(type(matrix)) 说:

<class 'cvxopt.base.matrix'>

生成的矩阵具有整数类型 (the 'i'),因为起始 numpy 数组包含整数。以double 开头的结果是'd' 类型。

【讨论】:

    【解决方案2】:

    检查我在 cvxopt 论坛 (https://groups.google.com/forum/?fromgroups=#!topic/cvxopt/9jWnkbJvk54) 上发布的修补后的 dense.c。使用它重新编译,您将能够将 np 数组转换为密集矩阵。我认为稀疏矩阵需要进行相同类型的编辑,但由于我不需要它们,我将把它留给开发人员。

    【讨论】:

    • 修补后的 dense.c 仅在从 numpy.array 转换为 cvxopt.matrix 时有效,反之则无效。
    【解决方案3】:

    虽然它不是固定的,但一个简单的解决方法

    cvxopt.matrix(nparray)
    

    cvxopt.matrix(nparray.T.tolist())
    

    相反的方向更难。如果你期望 int 数组,

    np.vectorize(lambda x: int.from_bytes(x, 'big'))(np.array(cvxoptmat).T)
    

    对于双数组:

    import struct
    np.vectorize(lambda x: struct.unpack('d', x))(np.array(cvxoptmat).T)
    

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      相关资源
      最近更新 更多