【问题标题】:How to find the index of the first row of a matrix that satisfies two conditions in APL Language?如何在APL语言中找到满足两个条件的矩阵的第一行的索引?
【发布时间】:2021-06-29 01:24:58
【问题描述】:

学习如何使用 APL 语言的另一个问题。 假设你有一个数组,例如:

c1 c2 c3 c4 c5 c6
3 123 0 4 5 6
3 134 0 2 3 4
3 231 180 1 2 5
4 121 0 3 2 4
4 124 120 4 6 3
4 222 222 5 3 5

那么,如何找出哪一行第一列的值为4,第三列的值大于0?

预期的答案是第 5 行,就在 5 行中

【问题讨论】:

  • 您要获取索引 (5) 还是行本身 (4 124 120 4 6 3)?另外,您是要查找满足条件的第一行还是所有行?
  • 只是索引没问题。仅第一行。谢谢@Bubbler。

标签: matrix lookup indices querying apl


【解决方案1】:

当您想要进行此类“查询”时,请考虑 布尔掩码

      table ← 6 6⍴3 123 0 4 5 6 3 134 0 2 3 4 3 231 180 1 2 5 4 121 0 3 2 4 4 124 120 4 6 3 4 222 222 5 

让我们提取第一列:

      table[;1]
3 3 3 4 4 4

并指出哪些元素的值为4:

      table[;1] = 4
0 0 0 1 1 1

同样,我们可以指出第 3 列的哪些元素的值大于 0:

      table[;3] > 0
0 0 1 0 1 1

它们的交集(逻辑与)表示满足您条件的所有行:

      (table[;1] = 4) ∧ (table[;3] > 0)
0 0 0 0 1 1

第一个 1 的索引是满足您条件的第一行的行号:

      ((table[;1] = 4) ∧ (table[;3] > 0)) ⍳ 1
5

Try it online!

或者,我们可以使用最终掩码过滤表并获取满足您条件的所有行:

      ((table[;1] = 4) ∧ (table[;3] > 0)) ⌿ table
4 124 120 4 6 3
4 222 222 5 3 5

Try it online!

或者我们可以生成所有的行号:

      ⍳ 1 ↑ ⍴ table
1 2 3 4 5 6

然后使用我们的布尔掩码对其进行过滤,找到满足您条件的所有行的行号:

      ((table[;1] = 4) ∧ (table[;3] > 0)) ⌿ ⍳ 1 ↑ ⍴ table
5 6

Try it online!

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 2019-03-09
    • 2014-09-08
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多