矩阵
我想创建一种矢量化方法(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循环进行此操作的,以便更好地解释它。
- 对于qtyP中的每一行/产品,通过查看rel检查需要哪些容量
- 对于所需的容量,请在qtyC中找到这些容量的最小数量
- 在qtyP中为当前行填充所有六周所需的最小容量
qtyP中的行是rel的行,qtyC内的行是rel的列。之所以采用产品中包含的最小容量,是因为这是可以构建的。在这个例子中,我碰巧有5个产品和5个容量,但也可能是3个产品和五个容量。那么rel矩阵将是(3x5(,qtyC基质将是(5x6(,qtyP基体将是(3x6(。
有没有一种矢量化方法可以做到这一点?我尝试了下面的代码,但在产品的顺序和如何包含最小功能方面,我似乎都做不好。
qtyP = qtyC[rel[np.newaxis,:] != 0]
编辑-根据注释更改我的答案。
IIUC,这是你可以做的-
- 因为,在计算最小值之前,你需要每周每个乘积的不同数量,所以你需要构建一个具有
broadcasting
的(6,5,5)
张量。对于每个week (6)
,对于每个product (5)
,得到相应值与rel row (5)
的乘积 - 在这个矩阵中,您现在可以在最后一个
axis=-1
上使用minimum
来获得(6,5)
矩阵 - 但是,由于存在零,np.min无法直接工作。因此,您可以使用
masked_array
来屏蔽0
值,然后在axis=-1
上找到minimum
- 最后
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]])
一定要检查一下,让我知道这是否能处理你的边缘案件。