使用 "floor division" 和 "modulus" 运算符索引矩阵

Indexing a matrix using "floor division" and "modulus" operators

我看到一个 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>'
>>>

我看不出这是怎么回事。

对此有何解释?

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

从平面开始的位置: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 ...等等

所以一个模式最明显。反过来考虑你的问题。

给定行和列索引,'book'(即扁平化)索引为 i = x + ny 其中 n 是一行中的元素数,在你的情况下 3. 这种一般模式适用于任何地方。这个等式并没有真正完整地回答你的问题,但希望它能说明一些问题。

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

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

类似地查看 idy 我们看到 3 个元素的值保持不变,以周期性方式增加 1 .如果你继续使用关于 3 的连续整数的 floor 函数,这就是你得到的结果(当然这是概括的。)

我希望这能回答您的问题。我在 Excel 中构建棋盘时学习了这种逻辑,并希望根据 'flat index' 存储棋子,但计算 x/y 坐标的移动可能性要容易得多。将其绘制出来并标记坐标使其变得明显,这就是我在这里要做的。