首页 > 解决方案 > 使用 2D 数组跨行和列跟踪值到值的第一次出现?

问题描述

我四处寻找类似的东西,但找不到任何东西。也为我的问题的措辞而苦恼,所以请在这里耐心等待。我正在处理 excel 文件中提供的数据,并且可以使用 excel/VBA 和 python。我仍然在学习这两种方法,我只需要在正确的方向上推动使用哪种方法,这样我就可以通过它并学习。

假设我在制造设施中有一系列 5 个流程,每个流程由一列表示。有时,下游流程(第 5 列)会被备份并减慢上游流程(第 4 列,然后是第 3 列等)。我有一个二维数组,指示正在运行(0)或备份(1)。每列是一个单独的过程,每一行是一个时间间隔。该数组每次都将具有相同的大小(10000+ 行,5 列),但值会发生变化。例子:

MyArray = [0 0 0 0 0
           0 1 0 0 0
           1 1 0 0 1
           1 0 0 0 1
           0 0 0 1 1
           0 0 1 1 1
           0 0 1 1 0
           0 1 1 0 0
           0 1 0 0 0
           0 0 0 0 0]

本质上,当值为 1 时,我想将其追踪到最右上方相邻的 1。因此,对于第 1 列,第 2 行和第 3 行将追溯到第 2 列第 2 行。对于第 2 列,第 8 行和第 9 行将可以追溯到第 5 列第 3 行。目前我只有一个 if 语句在同一行内向右看,这总比没有好,但没有捕捉到备份多个上游进程时得到的级联效应。

我可以通过循环搜索以在列中查找直到找到零,然后如果下一列值为 1,则向上搜索直到找到零,然后重复。但这似乎效率很低,我觉得必须有更好的方法来做到这一点。任何类型的想法或评论都会非常有帮助。谢谢。

标签: pythonexcelvba

解决方案


一个提示实际上是从底行(我们称此行 r=0)和第一列 c=1 开始,然后向右搜索,直到找到 c=5 列。如果没有找到 1,则重复搜索倒数第二行,并继续搜索第一行。

每当在某个索引 (r, c) 处找到 1 时,递归地询问“该元素是否在 (r+1, c) 上方、右侧 (r, c+1) 或上方以及对 (r+1, c+1)。现在,我不确定在“平局”的情况下你会做什么,即当上面有一个 1 时,在 (r+1, c) 和另一个 1向右,在 (r, c+1) 处,但在 (r+1, c+1) 处为 0,但您可以用一个简单的 if 语句解决这种竞争。


推荐阅读