在向量中查找元素位置

3

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

lst ←  50 ? 100

如何查找向量中3次出现91的位置?

谢谢。


2
50?100⍳100(即0...99或1...100,取决于 ⎕IO)中随机选择50个不同的整数。91永远不会出现超过一次。你可能想要使用 ?50⍴100 - ngn
谢谢ngn,我应该意识到“?”只会生成唯一的值 - awyr_agored
4个回答

4

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

(lst=91)/⍳100

1
≢lst 而不是 ⍳100 会更好,以防 lst 长度改变。 - Adám

4

使用Dyalog 16.0,您可以使用新的单子函数“Where”。

lst=91

lst=91 会得到一个由0和1组成的向量。对其应用 可以获取所有1所在的位置。如果 lst 是一个矩阵,同样适用。


1
感谢ngn、Cows_quack和Probie。我应该更仔细地阅读《精通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) 通过布尔向量压缩lst向量,创建一个新向量,其中包含lst中'true'的位置。
如果我的描述有误,请纠正我?
简化:
使用“Where”函数使其更易读(尽管先前的方法显示了如何使用数组编程的APL思维方式来解决它):
lst=1
2 37          ⍝ Positions 2 and 37

感谢您在此事上的时间!

祝好


只是一个小修正 - +/ 中的 / 不是压缩函数,而是归约运算符。对于任何函数 FF/ a b c d e 等同于 a F b F c F d F e - Probie
谢谢Probie - 非常感谢。 - awyr_agored

1

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

      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                      │
└──┴──────────────────────────────────────────┘

在线尝试!


谢谢Adam抽出时间来帮忙,非常有帮助。תודה - awyr_agored

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接