【问题标题】:FInd location of element in a vector查找向量中元素的位置
【发布时间】:2018-11-26 00:15:46
【问题描述】:

我是 APL 的新手,我想找到一个元素在向量中的位置。例如,如果我创建一个包含 50 个随机数的向量:

lst ←  50 ? 100

假设 91 在向量中出现 3 次,我如何找到它的位置?

谢谢。

【问题讨论】:

  • 50?100 从 ⍳100 中随机选择 50 个 distinct 整数(即 0...99 或 1...100,具体取决于 ⎕IO)。 91 永远不会出现不止一次。你可能想要?50⍴100。
  • 感谢 ngn,我应该意识到这一点?仅生成唯一值

标签: algorithm apl array-algorithms dyalog


【解决方案1】:

我不是专家,但一个简单的方法是从⍳ 100 中选择元素,其中lst 中的对应元素是91

(lst=91)/⍳100

【讨论】:

  • 写≢lst而不是⍳100以防lst长度变化不是更好吗?
【解决方案2】:

在 Dyalog 16.0 中,您可以使用新的一元函数 ⍸“Where”。

⍸lst=91

lst=91 给出一个 0 和 1 的向量。在此应用⍸ 会给出所有 1 的位置。如果lst 是一个矩阵,这也有效。

【讨论】:

    【解决方案3】:

    感谢 ngn、Cows_quack 和 Probie。我应该更仔细地阅读 Mastering Dyalog APL,因为它在第 126 页也提到了这一点。所以把所有答案放在一起:

    ⍝ Generate a list of 100 non-unique random numbers
    lst ← ?100⍴100
    
    ⍝ How many times does 1, for example, appear in the vector Using the compress function?
    +/ (lst = 1)  ⍝ Appears twice
    2
    
    ⍝ Find the locations of 1 in the vector
    (lst = 1) / ⍳ ⍴ lst
    2 37          ⍝ Positions 2 and 37
    

    所以分解解决方案; (i) (lst = 1) 生成一个布尔向量,其中 true 出现在 int 值 1 存在的地方; (ii) 通过布尔向量压缩 lst 向量在 lst 中创建一个位置为 'true' 的新向量。

    如果我的描述不正确,请纠正我?

    简化:

    使用“Where”函数使其更具可读性(尽管前面的方法显示了如何使用数组编程的 APL 思维方式来解决它):

    ⍸lst=1
    2 37          ⍝ Positions 2 and 37
    

    感谢您抽出宝贵时间!

    问候

    【讨论】:

    • 只是一个快速修正——+/ 中的/ 不是压缩函数——它是reduce 运算符。对于任何函数F,F/ a b c d e 等于a F b F c F d F e
    • 感谢 Probie - 非常感谢
    【解决方案4】:

    虽然您的问题已经得到充分回答,但您可能对 Key 运算符 ⌸ 感兴趣。当它的派生函数被单子应用时,它接受一个操作数并为参数中的每个元素应用一次。该函数以唯一元素作为左参数,其索引列表作为右参数调用:

          lst ← ?100⍴10
          {⍺ ⍵}⌸lst
    ┌──┬──────────────────────────────────────────┐
    │3 │1 3 9 28 37 38 55 70 88                   │
    ├──┼──────────────────────────────────────────┤
    │10│2 6 13 17 30 59 64 66 71 82 83 96         │
    ├──┼──────────────────────────────────────────┤
    │7 │4 5 12 15 20 52 54 68 74 85 89 91 92      │
    ├──┼──────────────────────────────────────────┤
    │9 │7 11 24 47 53 58 69 86 90                 │
    ├──┼──────────────────────────────────────────┤
    │8 │8 14 16 21 43 51 63 67 73 80              │
    ├──┼──────────────────────────────────────────┤
    │2 │10 18 26 27 34 36 48 78 79 87             │
    ├──┼──────────────────────────────────────────┤
    │1 │19 25 31 32 33 42 57 65 75 84 97 98 99 100│
    ├──┼──────────────────────────────────────────┤
    │6 │22 23 45 46 50 60 76 94                   │
    ├──┼──────────────────────────────────────────┤
    │5 │29 49 56 61 72 77 93 95                   │
    ├──┼──────────────────────────────────────────┤
    │4 │35 39 40 41 44 62 81                      │
    └──┴──────────────────────────────────────────┘
    

    Try it online!

    【讨论】:

    • 感谢 Adam 抽出宝贵时间 - 非常有帮助。 תודה
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 2010-11-13
    • 2015-04-15
    • 2022-01-08
    • 2018-11-21
    • 2011-01-21
    • 1970-01-01
    相关资源
    最近更新 更多