首页 > 解决方案 > 使用“地板除法”和“模数”运算符索引矩阵

问题描述

我看到了一个 python 代码,其中可以使用“索引”和 python 运算符“地板除法”和“模数”来获取矩阵中的值。

给定下面的 (3,3) 矩阵。

>>> m = np.array([['0>','1>','2>'],['3>','4>','5>'],['6>','7>','8>']])
>>> m
array([['0>', '1>', '2>'],
       ['3>', '4>', '5>'],
       ['6>', '7>', '8>']], dtype='<U2')

如果我们“扁平化”给定的矩阵,我们将拥有:

>>> m.reshape(-1)
array(['0>', '1>', '2>', '3>', '4>', '5>', '6>', '7>', '8>'], dtype='<U2')

假设我想读取值 '3>',它是数组中第 4 个位置的值。

如果我使用索引3,我可以从矩阵中获取相应的值,使用:

>>> idx = int(np.where(m.reshape(-1) == '3>')[0])
>>> idx
3
>>> x = idx // m.shape[0]
>>> y = idx % m.shape[0]
>>> 
>>> m[x][y]
'3>'
>>>

我看不出这是如何工作的。

对此有何解释?

标签: pythonnumpydeep-learninglinear-algebrareinforcement-learning

解决方案


如果您像读一本书一样阅读数组(从左到右,从上到下逐行),那么从开头开始的每个字符位置(即一旦变平的索引)对应于形状矩阵中的xy索引,如下所示:

从平面开始的位置:0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 ...等

矩阵中的y索引 m : 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 ...等

矩阵中的x索引 m : 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 1 ...等

因此,一种模式本身就很明显。反过来考虑你的问题。

给定行和列索引,“书”(即展平)索引是i = x + ny,其中 n 是一行中的元素数,在您的情况下为 3。这种一般模式适用于任何地方。这个等式并没有真正完整地回答你的问题,但希望它能够提供一些启示。

我们可以在上面的 3 行集合中构造另外两个方程,一次查看 2 行。

查看idx我们看到将 id 除以元素的数量到一行始终会产生 x 地址作为余数

同样查看idy,我们看到 3 个元素的值保持不变,周期性地增加 1。如果您继续采用关于 3 的顺序整数的下限函数,这就是您所得到的(当然这可以概括。)

我希望这回答了你的问题。我在 Excel 中构建棋盘时学到了这个逻辑,并且想根据它们的“平面索引”来存储棋子,但是相对于 x/y 坐标计算移动可能性要容易得多。将其绘制出来并标记坐标使其变得明显,这就是我在这里的目标。


推荐阅读