我试着用一个简单的例子来解释我的目标。
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
项目。行程距离来自元素之间的单位。在此示例中,我将行程距离设置为0.5
维度b
。如果您已经在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
{1}},同时迭代x
中的每个元素valid
。 这似乎超级低效。有什么更好的方法来解决这个问题?
也许有办法对此进行矢量化?此外,我不能依赖于此示例中给出的0.5
的等距离。该方法需要使用bGrid
(或B
)计算当前单元格与下一个有效单元之间的距离。
答案 0 :(得分:1)
似乎这就是诀窍:
transition = np.array(valid, dtype=float)
for i in range(valid.shape[0]):
for j in range(valid.shape[1]):
transition[i, j] = 0 if valid[i, j] else transition[i, j-1] + bGrid[j] - bGrid[j-1] if j > 0 else np.NAN