APL从Array中删除元素

时间:2012-08-15 13:55:49

标签: apl

我是APL的新手。如何从数组中删除不需要的元素?

例如:

 X←1 2 3 4 5 6 7 8 9

现在我要删除等于4或6的X元素。我试过

X←4↓X

从X中删除4,但它不起作用。提前谢谢。

4 个答案:

答案 0 :(得分:9)

执行此操作的适当方法是使用without函数(dyadic tilda):

      x←1 2 3 4 5 6 7 8 9
      x~4 6
1 2 3 5 7 8 9

但是,如果您需要为了其他目的而移除要删除的项目的位置(可能是从某些其他相关数组中删除相应的项目),那么MrZander的技术是合适的。

答案 1 :(得分:3)

试试这个,假设x = 1 2 3 4 5 6 7 8 9

x←(~x∊4 6)/x

使用x在数组x∊4 6中查找4和6 输出:0 0 0 1 0 1 0 0 0(4和6的位置)

现在,使用~取消此数组,输出1 1 1 0 1 0 1 1 1(与上述相反)

使用/x将其应用于数组x,然后1 2 3 5 7 8 9

最后,使用x←将此值分配给x,并将x保留为所需的输出。

答案 2 :(得分:0)

您可以创建二进制掩码,使0表示“元素为4或6”,1表示“元素既不是4也不是6”。然后使用此掩码从数组中进行选择。

(~(6=X)∨(4=X))/X

答案 3 :(得分:0)

对于大多数用途,保罗曼苏尔提到的无功能是一种更好的方法。但如果您想使用位掩码,请尝试:

(~(X¹4 6))/X

(注意“¹”是“成员”原语,通常表示为epsilon字符。)

这将选择X的所有元素为4或6,然后应用not来为所有4或6的元素创建一个0的布尔值,并使用它来压缩X,删除所有4和6。也许更有用的是:

((bv{gets}~X{member}4 6))/X

这会将压缩矢量(也就是掩码)保存在单独的变量bv中。如果有几个结构应该保持同步,则bv可以用于压缩其他结构以匹配X.当然,bv的更复杂条件可能在实际工作代码中。 ({gets}代表赋值操作,通常用向左箭头表示。)