我是APL的新手,我想在矢量中找到元素的位置。例如,如果我创建一个包含50个随机数的向量:
lst ← 50 ? 100
如果在向量中出现3次,我怎样才能找到91的位置?
感谢。
答案 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 │
└──┴──────────────────────────────────────────┘