Я пытаюсь получить пригодную для использования версию многомерных массивов в Haskell, сопоставимую с массивами numpy
в Python и других языках.Я нашел другие вопросы о том, как написать пользовательские функции для массивов определенных измерений, но моя цель - более точно, получить аналогичное поведение функции Data.Vector
slice
, которая интуитивно понятна и выполняет работу с скобками.индексированные массивы других языков.
Vector
Функция slice
имеет тип V.slice :: Int -> Int -> V.Vector a -> V.Vector a
, поэтому вырезать вектор v
так же просто, как
import Data.Vector as V
let v = V.fromList [1..10]
i = 1
j = 5
V.slice i j v
Repa
's slice
, с другой стороны, имеет тип
R.slice :: (R.Slice sl, R.Shape (R.FullShape sl), R.Source r e) => R.Array r (R.FullShape sl) e -> sl -> R.Array R.D (R.SliceShape sl) e
, поэтому он принимает массив Repa и фигуру и возвращает задержанный массив.Я понимаю, что Repa не принимает целые числа в качестве индексов, но я ищу общее использование функции slice
для произвольного измерения, независимо от того, используется ли Repa
'(Z :. i)
или ixn
спецификация измерения.
Я не ищу зависящую от измерения функцию, использующую traverse
, и предпочел бы не заходить ни в какой шаблон haskell, чтобы обобщить это, хотя, если невозможно использовать функцию slice
, как правило, это то, что есть.
Тогда возникает вопрос: можно ли использовать функцию Repa
*1032* для получения произвольных фрагментов многомерных массивов, как в numpy
'sv [x1: x2, y1: y2?] или C ++ Eigen
s matrix.block<p,q>(i,j)
?