是否有类似于 Vector 和其他语言的 Haskell Repa 切片函数的使用?

Posted

技术标签:

【中文标题】是否有类似于 Vector 和其他语言的 Haskell Repa 切片函数的使用?【英文标题】:Is there usage of Haskell Repa slice function analogous to Vector and other languages? 【发布时间】:2018-11-26 01:40:00 【问题描述】:

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

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

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

那么问题来了:是否可以使用Repaslice 函数来获取多维数组的任意切片,例如numpy 的v[x1:x2,y1:y2] 或C++ @ 987654341@的matrix.block<p,q>(i,j)

【问题讨论】:

numpy's v[x1:x2,y1:y2] 表示获取索引 (1,1), (1,2), (2,1), (2,2) 的元素并返回结果为 2 x 2 metrix ? 这意味着获取索引x1x2之间的第一维(我称之为x)中的所有元素,以及y1y2之间的第二维(y) .在 Python 中,您提到的那些元素将是 x1,x2 = y1,y2 = 1,3 或 v[1:3,1:3],这实际上是一个 2x2 矩阵,因为 numpy 数组不包括最后一个索引。在 Haskell 中,V.slice 1 2 v 会对单个维度进行类似的操作,但是在 Repa 的教程或文档中并没有直接描述对 2 个或更多维度的操作 【参考方案1】:

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

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

【讨论】:

谢谢。这似乎工作正常.. 与其他语言甚至 Vector.slice 相比仍然相当麻烦。我可以处理沿切片维度保持相同数量的维度和大小 1 的数组,这并不理想,但在没有 Repa.slice 的模拟使用的情况下可行。

以上是关于是否有类似于 Vector 和其他语言的 Haskell Repa 切片函数的使用?的主要内容,如果未能解决你的问题,请参考以下文章

是否有几乎类似于 Django 模板语言的 PHP 模板语言?

是否可以在浏览器中创建类似于 Google Chrome 的工作区的东西?

Go 和命名空间:是不是有可能实现类似于 Python 的东西?

STL中vector,list,deque和map的区别

实体框架代码优先:共享主键

73.迭代器