Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将cvxpy仿射表达式与np.array求和时出现广播错误_Python_Cvxpy - Fatal编程技术网

Python 将cvxpy仿射表达式与np.array求和时出现广播错误

Python 将cvxpy仿射表达式与np.array求和时出现广播错误,python,cvxpy,Python,Cvxpy,在以下代码段中,我打算执行以下操作: (1) 将标识的每个元素乘以d优化变量。 (2) 将1的向量与CVXPY仿射表达式求和,CVXPY仿射表达式也是24个元素的向量。 (3) 创建一个按元素比较两个向量的约束 import numpy as np import cvxpy as cp weights = cp.Variable(5) d = cp.Variable(1) meas = np.random.rand(8, 3) det = np.

在以下代码段中,我打算执行以下操作:

(1) 将标识的每个元素乘以d优化变量。
(2) 将1的向量与CVXPY仿射表达式求和,CVXPY仿射表达式也是24个元素的向量。
(3) 创建一个按元素比较两个向量的约束

    import numpy as np
    import cvxpy as cp

    weights = cp.Variable(5)
    d = cp.Variable(1)
    meas = np.random.rand(8, 3)
    det = np.random.rand(24, 5)

    dm = d * np.eye(3)   # (1)
    beh = np.ones([24, 1]) + cp.reshape((dm @ meas.T).T, [24, 1])    # (2)
    constrs = [beh == det @ weights]   #(3)
我的问题是:

Q1:我是否编写了我想要的代码

Q2:在(2)处,我得到以下错误:

/usr/lib/python3.8/site-packages/cvxpy/utilities/shape.py in sum_shapes(shapes)
     45         # Only allow broadcasting for 0D arrays or summation of scalars.
     46         if shape != t and len(squeezed(shape)) != 0 and len(squeezed(t)) != 0:
---> 47             raise ValueError(
     48                 "Cannot broadcast dimensions " +
     49                 len(shapes)*" %s" % tuple(shapes))

ValueError: Cannot broadcast dimensions  (24, 1) [24, 1]
这到底意味着什么?我该如何修复它


Q3:当我在第(3)处执行
det@weights
时,我得到一个
表达式(仿射,未知,(24,)
。在约束中,我将它与
beh
进行比较,我猜这将是一个
表达式(仿射,未知,(24,1))
。这种比较是否也会带来问题

当我开始使用cvxpy时,我在尺寸匹配方面也遇到了一些问题。根据我的经验,使用尽可能少维度的数组是一个好主意。因此,如果您有一个二维数组,其中1个维度的长度只有1,请查看是否可以减少维度。(见下文)

(2)中的问题在将cvxpy表达式重塑为(24,1)时使用的括号更改为(24,1)时得到解决,如下所示:

beh = np.ones([24, 1]) + cp.reshape((dm @ meas.T).T, (24, 1))    # (2)
您也可以通过简单地执行以下操作来避免问题:

beh = 1 + cp.reshape((dm @ meas.T).T, (24, 1))    # (2)
这将执行相同的操作:向cvxpy数组的每个条目添加1

完成此操作后,最后一行出现问题:“ValueError:无法广播维度(24,1)(24,1)”

这可以通过将维度
(24,)
也设置为
beh
来解决(如前所述,降低维度将解决您的问题)。完整的工作守则是:

import numpy as np
import cvxpy as cp
weights = cp.Variable(5)
d = cp.Variable(1)
meas = np.random.rand(8, 3)
det = np.random.rand(24, 5)

dm = d * np.eye(3)   # (1)
beh = 1 + cp.reshape((dm @ meas.T).T, (24, ))    # (2)
constrs = [beh == det @ weights]   #(3)

希望这有帮助

两个问题。1.您使用的是什么“一”功能。是np.ones吗?2.我不理解detp是如何工作的,因为代码中没有变量是detp。应该是det@weights吗?两者都可以。我忘了指定np.ones,在detp中有一个输入错误。我编辑了这个问题。谢谢你指出这些。