Python 将cvxpy仿射表达式与np.array求和时出现广播错误
在以下代码段中,我打算执行以下操作: (1) 将标识的每个元素乘以d优化变量。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.
(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中有一个输入错误。我编辑了这个问题。谢谢你指出这些。