【问题标题】:Indexing a matrix using "floor division" and "modulus" operators使用“地板除法”和“模数”运算符索引矩阵
【发布时间】:2020-11-07 19:39:17
【问题描述】:

我看到了一个 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 的表达式吗?你打印出这些值了吗?您是否尝试过一次做一级索引(例如row = m[x])?
  • @Blckknght 我写了代码。我不明白这些操作如何正确索引矩阵。

标签: python numpy deep-learning linear-algebra reinforcement-learning


【解决方案1】:

如果你像读一本书一样阅读数组(从左到右,从上到下逐行),那么每个字符从开始的位置(即索引一次展平)对应一个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 坐标计算移动可能性要容易得多。将其绘制出来并标记坐标使其变得明显,这就是我在这里的目标。

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2020-03-11
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多