at

语法

at(X, [index])

参数

如果只指定了一个参数,X 是布尔表达式或向量。

如果指定了两个参数,X 可以是一个标量、向量(常规向量/元组)、矩阵、表、字典、数据对、函数。index 可以是一个布尔表达式/布尔值、标量、向量(常规向量/元组)、数据对。

详情

在第一种情况下,函数返回 X 中结果为 true 的元素位置。

在第二种情况下:

  • 如果 index 是布尔表达式,at 函数返回 Xindex 为 true 的位置的元素。 at 函数等价于中括号运算符 []. 比如,”X.at(X>3)” 和 “X[X>3]” 相同。

  • 如果 index 是向量,以向量中的值作为索引值,寻找 X 中该索引位置的值并返回。

  • 如果 index 是元组,则元组的元素作为 X 每个维度的索引,寻找 X 中该索引位置的值并返回。

  • 如果 index 是数据对,如 a:b, 则表示索引范围为 [a,b),寻找 X 中该范围的值并返回。

请注意,index 作为索引值或索引范围时,若其值不在 [0, size(X)-1] 内,则超出 [0, size(X)-1] 的值所对应的位置返回空值。

若 X 是函数,则 index 将作为函数的参数。

例子

$ x=5 7 0 4 2 3
$ at(x>3)
[0, 1, 3]
// 在位置 0, 1 和 3,x>3 为 true

// 和 x>3 相比
$ x>3;
[1, 1, 0, 1, 0, 0]

$ x[x>3]
[5, 7, 4]
$ x at x>3
[5, 7, 4]

$ x=5 7 0 0 0 3
$ at(x==0)
[2, 3, 4]

$ x[x==0]
[0, 0, 0]

$ shares=500 1000 1000 600 2000
$ prices=25.5 97.5  19.2 38.4 101.5
$ prices[shares>800]
[97.5, 19.2, 101.5]
$ prices at shares>800
[97.5, 19.2, 101.5]
$ m=(1..6).reshape(2:3)
$ m;

0

1

2

1

3

5

2

4

6

$ at(m>3)
[3,4,5]

$ m[m>3] // 等价于 m at m>3

col1

col2

col3

5

4

6

注意区分 index 是向量和元组的两种不同场景:

$ m at [0,2]  // 选择第 0 列和第 2

0

1

1

5

2

6

$ m at (0,2) // 查找特定行列的元素
5
$ m at 0:2 // 选择第 0 列和第 1

0

1

1

3

2

4

若 X 是函数:

$ (sum)[1..10]
55

$ (corr)[1 3 -1, 2 3 4]
-0.5000