我将尝试用一个简单的例子来解释我所追求的 .
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
项目之前需要执行的"travel distance" . 行程距离来自元素之间的单位 . 在这个例子中,我沿着 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
,同时迭代 valid
中的每个元素 x
. This seems to be super inefficient. 什么是更好的方法来接近它?
也许有一种方法来矢量化这个?此外,我不能依赖于此示例中给出的 0.5
的等距离 . 该方法需要使用 bGrid
(或 B
)计算当前单元格与下一个有效单元之间的距离 .
1 回答
似乎这就是诀窍: