【问题标题】:How to stack arrays in repa (Haskell)如何在 repa 中堆叠数组(Haskell)
【发布时间】:2016-06-29 13:47:42
【问题描述】:

假设有两个长度相同的一维数组:

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

现在我想将这两个数组堆叠成一个二维数组,以便这些数组形成行。如何在 repa 中做到这一点?

基本上,我正在寻找相当于 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 这两个数组来自外部,即我无法从头开始创建二维数组。

【问题讨论】:

  • 我认为您需要的只是将reshape xy 数组设为 2D,然后将 append 设为它们。

标签: arrays haskell repa


【解决方案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

【讨论】:

  • 谢谢,就是这样。只是出于好奇-是否可以控制附加数组的维度?还是只在最后一个?
  • @zegkljan 我不认为有一个巧妙的通用方法 - 你必须改变形状,追加,然后改变形状。对于二维,您可以使用transpose,否则我认为您会使用backpermute。请记住,即使是 numpy 的 col_stack 也仅适用于一维参数 - 没有简单的方法可以将 row_stackcol_stack 推广到 N 维。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2018-02-01
相关资源
最近更新 更多