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 是数组向量,对于 index 中的每行元素都作为一个索引值,寻找 X 中对应该索引位置的元素,然后返回一个和 index 结构相同的数组向量。

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

例子

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

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

x[x>3]
# output
[5, 7, 4]
x at x>3
# output
[5, 7, 4]

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

x[x==0]
# output
[0, 0, 0]

shares=500 1000 1000 600 2000
prices=25.5 97.5  19.2 38.4 101.5
prices[shares>800]
# output
[97.5, 19.2, 101.5]
prices at shares>800
# output
[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)
# output
[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) // 查找特定行列的元素
# output
5
m at 0:2 // 选择第 0 列和第 1 列
0 1
1 3
2 4

index 是数组向量的情况:

a = array(INT[], 0, 10).append!([0 2 3, 0 5, 0 8 8, 9 10])
b =[1, 2, 3]
at(b, a)
# output
[[1,3, ], [1, ], [1, , ], [ , ]]
at(a,a>3)
# output
[,[5],[8,8],[9,10]]