Как складывать массивы в repa (Haskell)

Предположим, что есть два одномерных массива одинаковой длины:

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

Теперь я хотел бы сложить эти два массива в один двумерный массив, чтобы эти массивы образовывали строки. Как я могу сделать это в репе?

В принципе, я ищу эквивалент row_stack numpy:

>>> 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]])

Примечание. Два массива, x и y, поступают извне, т. е. я не могу создать двумерный массив с нуля.


person zegkljan    schedule 29.06.2016    source источник
comment
Я думаю, все, что вам нужно, это reshape чтобы массивы x и y были двумерными, а затем append их.   -  person Alec    schedule 29.06.2016


Ответы (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
person Alec    schedule 29.06.2016
comment
Спасибо, это все. Просто из любопытства - можно ли контролировать, в каком измерении добавляются массивы? Или это только в последнем? - person zegkljan; 01.07.2016
comment
@zegkljan Я не думаю, что для этого есть гладкий общий подход - вам нужно изменить форму, добавить, а затем изменить форму обратно. Для двух измерений вы можете использовать transpose, но в противном случае, я думаю, вы бы выбрали backpermute. Имейте в виду, что даже col_stack для numpy работает только для аргументов 1D - просто нет простого способа обобщить как row_stack, так и col_stack на N измерений. - person Alec; 04.07.2016