2016-06-29 40 views
1

假设有相同的长度的两个1-d阵列:如何堆叠阵列中repA的(Haskell中)

let x = fromListUnboxed (ix1 4) [1, 2, 3, 4] 
let y = fromListUnboxed (ix1 4) [5, 6, 7, 8] 

现在我想这两个阵列堆叠成一个2-d阵列,使得这些数组形成行。我怎样才能做到这一点?

基本上,我正在寻找numpy的的row_stack的等效:

>>> x = np.array([1, 2, 3, 4]) 
>>> y = np.array([5, 6, 7, 8]) 
>>> np.row_stack((x, y)) 
array([[1, 2, 3, 4], 
     [5, 6, 7, 8]]) 

注意。这两个阵列xy来自外部,即我无法从头开始创建2维阵列。

+0

我认为,所有你需要的是'reshape'了'x'和'y'阵列为2D,然后追加' '他们。 – Alec

回答

1

正如我在最初的注释中提到,所有你需要的是reshape然后append(无论是在Data.Array.Repa

ghci> let x' = reshape (ix2 4 1) x 
ghci> let y' = reshape (ix2 4 1) y 
ghci> z <- computeP $ x' `append` y' :: IO (Array U DIM2 Int) 
ghci> z 
AUnboxed ((Z :. 4) :. 2) [1,5,2,6,3,7,4,8] 

至于漂亮的印刷,repa不是很好(有可能是因为没有对于高维好漂亮打印)。这是一个在线黑客显示z

ghci> putStr $ unlines [ unwords [ show $ z ! ix2 i j | i<-[0..3] ] | j<-[0..1] ] 
1 2 3 4 
5 6 7 8 
+0

谢谢,就是这样。出于好奇 - 是否可以控制数组添加的维度?还是只在最后一个? – zegkljan

+0

@zegkljan我不认为有这样一个灵活的通用方法 - 你必须改变形状,追加,然后改变形状。对于两个维度,你可以使用'转置',但否则我认为你会''backpermute'去。请记住,即使'col_stack' for numpy也只适用于一维参数 - 没有简单的方法将'row_stack'和'col_stack'概括为N维。 – Alec