使用掩码向量过滤另一个向量

问题描述 投票:0回答:1

我有两个向量:

(def x [true false true]) 
(def y [1 2 3])

我想根据

y
过滤
x
。我最初的尝试是这样的:

(remove nil? (map #(when %1 %2) x y)) 

根据需要返回

(1, 3)

我的问题是,有没有办法可以达到相同的结果,而不必在最后过滤掉 nils ?例如,我注意到

keep
在返回之前删除了 nils,但它似乎不像 map 那样接受多个集合。有没有更优雅的方法使用上面的掩码向量进行过滤?

clojure
1个回答
0
投票

有很多很多方法。

关于您的初始尝试,需要注意的一件事是

map
始终返回与其最短集合输入长度相同的序列。因此,在您的情况下,您总是会得到长度为三的序列,因此需要
remove nil?

这是

reduce
的另一次尝试:

user> (def x [true false true]) 
#'user/x
user> (def y [1 2 3])
#'user/y
user> (->> (map-indexed vector y)
           (reduce (fn [eax [i n]] 
                     (if (nth x i) (conj eax n) eax)) 
                   []))
[1 3]

如果您要使用这些类型的数组做很多事情,有一些库包含非常锋利的工具,可以非常有效地完成此类事情:

user> (require '[tech.v3.datatype.unary-pred :as un-pred])
nil
user> (un-pred/bool-reader->indexes x)
[0 2]
user> (def idxs *1)
#'user/idxs
user> (require '[tech.v3.tensor :as dtt])
nil
user> (dtt/select y idxs)
#tech.v3.tensor<object>[2]
[1 3]

c.f.,https://github.com/cnuernber/dtype-next

© www.soinside.com 2019 - 2024. All rights reserved.