【发布时间】:2015-03-17 03:53:48
【问题描述】:
我将尝试用一个简单的例子来解释我所追求的。
aGrid = np.arange(1,9)
bGrid = np.arange(101, 109, 0.5)
A, B = np.meshgrid(aGrid, bGrid, indexing='ij')
np.random.seed(66)
valid = np.random.choice([True, False], A.shape)
将valid 视为一个矩阵,用于确定您是否“是否允许留在网格点(a, b)。如果不允许您呆在那里,则必须通过减少b 来移动:您需要向左移动(沿行)。
我现在正在尝试创建这个transition 矩阵:对于这个valid 矩阵中的每个项目,它决定了您在到达下一个True 项目之前需要走的“旅行距离”。行进距离来自元素之间的单位。在此示例中,我将沿 b 维度的行进距离常量设置为 0.5。如果您已经在True 位置,则您的距离为0。
这里是给定种子的valid:
array([[False, True, True, True, True, True, False, True, True,
True, True, False, False, True, False, True],
[ True, True, True, True, True, False, True, False, True,
True, True, True, True, False, True, False],
[ True, True, False, True, False, False, False, True, True,
True, True, True, False, False, True, False],
[ True, True, False, False, True, False, False, False, False,
False, False, True, False, False, True, False],
[ True, True, True, True, True, True, True, False, True,
True, False, False, False, False, False, True],
[False, True, True, False, False, True, True, False, True,
True, False, True, False, False, False, False],
[ True, True, True, False, True, False, True, True, True,
False, False, True, False, True, False, True],
[False, True, False, False, True, False, True, True, False,
True, False, False, False, True, False, False]], dtype=bool)
一些预期的输出
对于第一个元素,我们不能再向左移动以找到True 值 - 默认应该是np.NaN。对于第一行接下来的 5 个元素,距离为0:它们已经在有效位置。 transition[0, 6] = 0.5: 需要向左移动一个元素。
所以,前两行将是
array([[NaN, 0, 0, 0, 0, 0, 0.5, 0, 0,
0, 0, 0.5, 1, 0, 0.5, 0],
[ 0, 0, 0, 0, 0, 0.5, 0, 0, 0,
0, 0, 0, 0, 0.5, 0, 0.5],
我试图使用np.argmax 和np.argmax 的组合来查找“最大元素True,但小于x,对于每个x,同时迭代每个元素x在valid。这似乎效率极低。有什么更好的方法来解决这个问题?
也许有办法将其矢量化?此外,我不能依赖此示例中给出的 0.5 的等距。该方法需要使用bGrid(或B)计算当前单元格与下一个有效单元之间的距离。
【问题讨论】:
-
我编辑了我的答案。如果我理解“使用 bGrid”的确切含义,它应该可以工作。