首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Repa中如何对索引进行谓词过滤

Repa中如何对索引进行谓词过滤
EN

Stack Overflow用户
提问于 2017-04-12 14:54:23
回答 2查看 363关注 0票数 2

我有两个Repa数组,a1a2,我想消除a2中的所有元素,对于这些元素,a1中的相应索引超过了一定的阈值。例如:

代码语言:javascript
复制
import qualified Data.Array.Repa as R -- for Repa
import Data.Array.Repa (Z (..), (:.)(..))


a1 = R.fromFunction (Z :. 4) $ \(Z :. x) -> [8, 15, 9, 14] ! x
a2 = R.fromFunction (Z :. 4) $ \(Z :. x) -> [0, 1, 2, 3] ! x
threshold = 10
desired = R.fromFunction (Z :. 2) $ \(Z :. x) -> [0, 2] ! x
-- 15 and 14 are above the threshold, 10

一种方法是使用selectP,但我想避免使用它,因为它计算数组,如果可能的话,我希望我的数组保持延迟的形式。

另一种方法是使用repa-array,但是stack solver似乎不知道如何使用解析器nightly-2017-04-10导入这个库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-25 02:20:19

考虑这个问题的一种方法是,为了创建一个Repa,您需要在创建时知道数组的大小(extent)。但是,在过滤器操作的情况下,如果不应用阈值谓词(本质上是计算结果数组的值),就无法在雷帕中知道结果数组的大小。

另一种看待它的方法是,Delayed数组是一个从索引到值的简单函数,对于大多数操作来说都很好。但是,为了进行筛选,当您应用谓词时,为了在特定索引上找到一个值,您现在需要知道结果数组中该索引之前的所有值,因为对于任何位置,一个值可能在那里,可能不存在。

向量包巧妙地用流融合解决了这个问题,下一个版本的Repa似乎正在尝试使用类似的方法,除非扩展到更高的维度(我可能错了,但还没有仔细观察)。

所以,简单的回答,没有办法做过滤与Repa风格的功能融合。以下任一项:

  • 坚持使用selectP --更快(可能),但内存效率更低(确实如此),或
  • ifilter包返回到vector上进行顺序过滤
票数 0
EN

Stack Overflow用户

发布于 2017-04-13 00:21:27

您可以用zip构建成对的列表,然后通过带有(Int,Int) -> Bool类型的谓词函数生成filter,最后通过分别使用map fstmap snd提取对的第一个或第二个元素(取决于您想要的元素)。你需要的一切都在前奏曲里。

我希望这是足够的信息,这样你就可以自己拼凑起来了。如果有疑问,请查看我提到的函数的类型签名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43373042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档