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



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

我看不出这是怎么回事。

对此有何解释?

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

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

矩阵中的y索引m:0|0|1|1|2|2|3|3。。。etc

矩阵中的x索引m:0|1|2|0|1|2|0。。。etc

因此,一种模式会让自己变得显而易见。反过来考虑你的问题。

给定行和列索引,"book"(即扁平化(索引为i=x+ny,其中n是一行中的元素数,在您的情况下为3。这种普遍模式适用于任何地方。这个等式并不能完全回答你的问题,尽管希望它能提供一些线索。

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

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

类似地,观察idy,我们发现3个元素的值保持不变,以周期性的方式增加1。这就是你得到的,如果你一直拿序列整数相对于3的下限函数(当然这是广义的(

我希望这能回答你的问题。我在Excel中构建棋盘时学会了这个逻辑,并希望根据棋子的"平面索引"存储棋子,但相对于x/y坐标,计算移动可能性要容易得多。把它画出来并标记坐标,使它变得显而易见,这就是我在这里要做的。

相关内容

  • 没有找到相关文章

最新更新