2017-04-12 26 views
1

我有兩個惹巴陣列a1a2和我想消除在a2所有元素爲其在a1相應索引是高於某個閾值。例如:如何通過謂詞上索引來篩選惹巴

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

+0

如果是這樣的只有你需要的東西,將它作爲一組對來建模會更好。這裏的順序沒有意義,只有特定的元素配對在一起。 – Lazersmoke

回答

0

查看此問題的一種方法是,爲了創建修復陣列,您需要在創建時知道陣列的大小(extent)(例如fromFunction),但在過濾器操作的情況下,如果不應用閾值謂詞,本質上計算得到的數組的值,無法知道repa中的結果數組的大小。

查看它的另一種方法是,D elayed數組是一個從索引到值的簡單函數,這對大多數操作來說都很好。但是,對於過濾,當您應用謂詞時,爲了在特定索引處查找值,您現在需要知道在結果數組中找到該索引之前的所有值,導致出現任何位置,值可能存在,也許不。

vector包優雅的解決了這個問題,與流的融合,以及repa-array,惹巴,仍處於實驗階段的下一個版本,似乎是在試圖用類似的方法,除了與extention更高的尺寸(我可能是錯的,沒有看得太緊)。

因此,簡短的回答,沒有辦法用Repa樣式功能融合進行過濾。或者:

  • 堅持selectP - 更快的(可能),但較少的內存使用效率(肯定的),或
  • 捎帶到ifiltervector包順序 過濾
0

可以通過一個謂詞函數與類型(Int,Int) -> Bool建立對的列表與zip,然後filter和通過分別使用map fstmap snd最後提取對所述第一或第二元件(取決於你想要哪一個)。你需要的一切都在Prelude中。

我希望這是足夠的信息,所以你可以把自己放在一起。如果有疑問,請查看我提到的功能的類型簽名。

+0

可能更有用,您可以使用'Data.Maybe'模塊中的'mapMaybe ::(a - > Maybe b) - > [a] - > [b]'來同時映射和過濾。 – zbw

+0

對不起,我原來的問題並不清楚,但我有興趣在Repa做這個工作。這些可能是非常大的數組,所以前奏列表不會是一個好選擇。 Repa庫似乎沒有過濾功能。 – ethanabrooks