矢量化矩阵计算比较关系矩阵并在Python中取最小值



矩阵

我想创建一种矢量化方法(numpy(来填充/计算称为";qtyP";使用来自矩阵"的输入;qtyC";以及";rel";。在for循环中求解很容易,但我想用更聪明的方法来解决。首先我将描述我的矩阵。

产品与周矩阵(最终结果(

# This is the desired end-result matrix (5x6)
# It describes how much of each product is available per week
# Rows: Products (5)
# Columns: Weeks (6)
qtyP = [[0,3,0,10,22,53],
[0,0,75,154,213,250],
[0,0,75,154,213,250],
[0,0,75,154,213,250],
[0,0,17,68,133,180]]
qtyP = np.matrix(qtyP)

容量与周矩阵

# This matrix (5x6) describes how much of each capacity is available per week
# Rows: Capacities (5)
# Columns: Weeks (6)
qtyC = [[0,0,17,68,133,180],
[0,0,75,154,213,250],
[0,0,39,11,34,100],
[0,0,357,648,861,1531],
[0,3,0,10,22,53]]
qtyC = np.matrix(qtyC)

产品与产能关系矩阵

# This matrix (5x5) details the relationship between "Products" and "Capacities".
# If there is a 1 then that capacity is needed for the product
# e.g. capacity 5 is need for product 1
# e.g. capacity 2 and 4 is needed for product 2
# Rows: Products (5)
# Columns: Capacities (5)
rel = [[0,0,0,0,1],
[0,1,0,1,0],
[0,1,0,1,0],
[0,1,0,1,0],
[1,0,0,1,0]]
rel = np.matrix(rel)

如何获得最终结果

我将解释我是如何使用for循环进行此操作的,以便更好地解释它。

  1. 对于qtyP中的每一行/产品,通过查看rel检查需要哪些容量
  2. 对于所需的容量,请在qtyC中找到这些容量的最小数量
  3. qtyP中为当前行填充所有六周所需的最小容量

qtyP中的行是rel的行,qtyC内的行是rel的列。之所以采用产品中包含的最小容量,是因为这是可以构建的。在这个例子中,我碰巧有5个产品和5个容量,但也可能是3个产品和五个容量。那么rel矩阵将是(3x5(,qtyC基质将是(5x6(,qtyP基体将是(3x6(。

有没有一种矢量化方法可以做到这一点?我尝试了下面的代码,但在产品的顺序和如何包含最小功能方面,我似乎都做不好。

qtyP = qtyC[rel[np.newaxis,:] != 0]

编辑-根据注释更改我的答案。

IIUC,这是你可以做的-

  1. 因为,在计算最小值之前,你需要每周每个乘积的不同数量,所以你需要构建一个具有broadcasting(6,5,5)张量。对于每个week (6),对于每个product (5),得到相应值与rel row (5)的乘积
  2. 在这个矩阵中,您现在可以在最后一个axis=-1上使用minimum来获得(6,5)矩阵
  3. 但是,由于存在零,np.min无法直接工作。因此,您可以使用masked_array来屏蔽0值,然后在axis=-1上找到minimum
  4. 最后fill屏蔽值如果返回,由0和transpose得到一个(5,6(矩阵
b = qtyC.T[:,None,:] * rel   #(6,5,5)
c = np.ma.masked_array(b, mask=b==0).min(-1)
qtyP = c.filled(0).T
print(qtyP)
array([[  0,   3,   0,  10,  22,  53],
[  0,   0,  75, 154, 213, 250],
[  0,   0,  75, 154, 213, 250],
[  0,   0,  75, 154, 213, 250],
[  0,   0,  17,  68, 133, 180]])

一定要检查一下,让我知道这是否能处理你的边缘案件。

最新更新