Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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中比较关系矩阵并取最小值的向量化矩阵计算_Python_Numpy - Fatal编程技术网

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

在Python中比较关系矩阵并取最小值的向量化矩阵计算,python,numpy,Python,Numpy,矩阵 我想创建一个矢量化方法(numpy),使用矩阵“qtyC”和“rel”的输入填充/计算名为“qtyP”的矩阵。在for循环中求解是很容易的,但我想用一种更聪明的方式来解决。首先,我将描述我的矩阵 产品与周矩阵(最终结果) 容量与周矩阵 # This matrix (5x6) describes how much of each capacity is available per week # Rows: Capacities (5) # Columns: Weeks (6) qtyC =

矩阵

我想创建一个矢量化方法(numpy),使用矩阵“qtyC”和“rel”的输入填充/计算名为“qtyP”的矩阵。在for循环中求解是很容易的,但我想用一种更聪明的方式来解决。首先,我将描述我的矩阵

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

容量与周矩阵

# 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)

产品与产能关系矩阵

# 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)

如何获得最终结果

# 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)
我将解释如何使用for循环来实现这一点,以便更好地解释它

  • 对于qtyP中的每一行/产品,通过查看rel检查所需的容量
  • 对于所需容量,请找到qtyC中的最小容量
  • 为qtyP中的当前行填充所有六周所需容量的最小数量
  • qtyP中的行是rel中的行,qtyC中的行是rel中的列。选择产品中包含的最小容量的原因是因为这是可以构建的。在这个例子中,我碰巧有5个产品和5个容量,但也可能有3个产品和5个容量。那么rel矩阵将是a(3x5),qtyC矩阵将是a(5x6),qtyP矩阵将是a(3x6)

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

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

    编辑-根据评论更改我的答案

    IIUC,这是你能做的-

  • 因为,在计算最小值之前,您需要每周每个产品的不同数量,所以您需要构造一个
    (6,5,5)
    张量和
    广播
    。对于每个
    周(6)
    ,对于每个
    产品(5)
    获取与
    rel行(5)
    对应值的乘积
  • 在该矩阵中,您现在可以在上一个
    轴=-1上取
    最小值
    ,以获得
    (6,5)
    矩阵
  • 但是,由于存在零,np.min不能直接工作。因此,您可以使用
    masked_数组
    来屏蔽
    0
    值,然后在
    轴=-1上找到
    最小值
  • 最后,
    填充
    如果返回屏蔽值,则通过0和
    转置
    得到一个(5,6)矩阵

  • 一定要检查并让我知道这是否能处理您的边缘案例。

    编辑-根据评论更改我的答案

    IIUC,这是你能做的-

  • 因为,在计算最小值之前,您需要每周每个产品的不同数量,所以您需要构造一个
    (6,5,5)
    张量和
    广播
    。对于每个
    周(6)
    ,对于每个
    产品(5)
    获取与
    rel行(5)
    对应值的乘积
  • 在该矩阵中,您现在可以在上一个
    轴=-1上取
    最小值
    ,以获得
    (6,5)
    矩阵
  • 但是,由于存在零,np.min不能直接工作。因此,您可以使用
    masked_数组
    来屏蔽
    0
    值,然后在
    轴=-1上找到
    最小值
  • 最后,
    填充
    如果返回屏蔽值,则通过0和
    转置
    得到一个(5,6)矩阵

  • 一定要检查并让我知道这是否能处理您的边缘案例。

    感谢您的评论和建议方法。您的建议似乎适用于此处给出的数字,但是,当我在中减少
    qtyC
    中的容量时,例如,将1531减至10,则建议的方法会导致错误的矩阵答案。我认为我没有正确地阅读rel正在做的事情。你能解释一下rel是什么吗?每行单独?我用标题“产品与容量关系矩阵”详细描述了代码块中的rel。每一行都是一个产品,描述了它需要的列容量。因此,产品1仅具有5号容量,而产品2具有2号和4号容量。这意味着每周需要检查每个产品的最小容量,以了解可以构建多少。因此,对于第4周的产品2,我们有154的容量2和648的容量4,这两个最小值是154,可以用产品2构建。生产的产品数量为:
    qtyP(2,4)=min[qtyC(2,4),qtyC(4,4)]
    ohhh其产能数量?这是索引吗?明白了,看来效果不错!将测试更多的数字,但到目前为止,在不同的情况下效果良好。非常感谢您的时间和回复!感谢您的评论和建议方法。您的建议似乎适用于此处给出的数字,但是,当我在中减少
    qtyC
    中的容量时,例如,将1531减至10,则建议的方法会导致错误的矩阵答案。我认为我没有正确地阅读rel正在做的事情。你能解释一下rel是什么吗?每行单独?我用标题“产品与容量关系矩阵”详细描述了代码块中的rel。每一行都是一个产品,描述了它需要的列容量。因此,产品1仅具有5号容量,而产品2具有2号和4号容量。这意味着每周需要检查每个产品的最小容量,以了解可以构建多少。因此,对于第4周的产品2,我们有154的容量2和648的容量4,这两个最小值是154,可以用产品2构建。生产的产品数量为:
    qtyP(2,4)=min[qtyC(2,4),qtyC(4,4)]
    ohhh其产能数量?这是索引吗?明白了,看来效果不错!将测试更多的数字,但到目前为止,在不同的情况下效果良好。谢谢