0

我试图在 Haskell 中获得一个可用版本的多维数组,与numpyPython 和其他语言中的数组相当。我发现了其他关于如何为特定维度的数组编写自定义函数的问题,但我的目标更重要的是,得到Data.Vector'sslice函数的类似行为,这很直观并且可以完成其他语言的括号索引数组的工作。

Vectorslice函数有类型 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

Repaslice另一方面有类型

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's(Z :. i)还是ixn维度规范。

我不是在使用 寻找与维度相关的函数traverse,并且不希望进入任何模板 haskell 来概括它,尽管如果slice通常无法使用该函数,它就是它。

那么问题是:是否可以使用Repa'slice函数来获取多维数组的任意切片,例如在numpy'sv[x1:x2,y1:y2] 或 C++Eigenmatrix.block<p,q>(i,j)

4

1 回答 1

1

我相信最接近的等价物是extract,它采用起始索引(like ix2 x1 y1)和大小(like ix2 (x2-x1) (y2-y1))。

的结果extract始终具有与输入相同的维度数,但每个维度的大小可以不同。的结果slice可以有不同数量的维度,但在任何给定维度中,它要么采用所有元素,要么只采用一个。(基于 和 的实例ShapeSlice

于 2018-11-26T18:14:12.830 回答