向量中元素的位置

时间:2018-06-16 11:46:58

标签: algorithm apl array-algorithms dyalog

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

lst ←  50 ? 100

如果在向量中出现3次,我怎样才能找到91的位置?

感谢。

4 个答案:

答案 0 :(得分:4)

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

的元素
(lst=91)/⍳100

答案 1 :(得分:3)

使用Dyalog 16.0,您可以使用新的monadic函数" Where"。

⍸lst=91

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

答案 2 :(得分:1)

感谢 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)生成一个布尔向量,其中int值为1时出现true; (ii)通过布尔向量压缩第l个向量,创建一个位置为' true'在lst。

如果我的描述已关闭,请纠正我?

简化:

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

⍸lst=1
2 37          ⍝ Positions 2 and 37

感谢您抽出宝贵时间!

此致

答案 3 :(得分:1)

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

      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!