我是APL的新手。如何从数组中删除不需要的元素?
例如:
X←1 2 3 4 5 6 7 8 9
现在我要删除等于4或6的X元素。我试过
X←4↓X
从X中删除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}代表赋值操作,通常用向左箭头表示。)