gpt4 book ai didi

haskell - 在 Haskell 中复制 Numpy 的高级索引/切片

转载 作者:行者123 更新时间:2023-12-04 04:16:40 25 4
gpt4 key购买 nike

Numpy 在其数组访问运算符中具有复杂的索引/切片/步进功能。见:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

在尝试使用 Haskell 时,我认为尝试复制此索引功能的子集会很有教育意义。具体来说,它是“元组选择对象”或 n 维投影”( https://en.wikipedia.org/wiki/Projection_%28relational_algebra%29 )。

基本上你可以这样做:

two_d_array[0:1:1, 0:4:2]

这将为您提供以 1 为单位的第一行,其中包含以 2 为单位的前 2 列(跳过 1 列)。

换句话说,它可以将原始二维数组投影到更小的二维数组中。结果保留为二维数组。

所以这就是我在 Haskell 中尝试过的。

这种函数的类型应该是这样的:
(!!!) :: (Functor f) =>  f a -> [(Int, Int, Int)] -> f a

所以你可以看到类似的东西:
three_d_tensor !!! [(s1,e1,st1), (s2,e2,st2), (s3,e3,st3)]

其中 sx, ex, stx 分别是 start, end, step。

该示例应将原始张量投影为较小的张量,第一个维度受 s1 to e1, stepping by st1 限制,第二个维度受 s2 to e2, stepping by st2 限制... ETC。

所以这就是我得到的:
slicing from to xs = take (to - from + 1) (drop from xs)

stepping n = map head . takeWhile (not . null) . iterate (drop n)

(!!!) tensor ((start, end, step):tail) =
project (stepSlice start end step tensor) tail map
where
project tensor ((start, end, step):tail) projection =
project (projection (stepSlice start end step) tensor) tail (projection . map)
project tensor [] _ =
tensor
stepSlice start end step tensor =
((stepping step) . (slicing start end)) tensor

由于“多态递归”的问题,上述方法不起作用。基本上我不能无限地组成 map函数,执行此操作的具体表达式是 (projection . map) .如果这种多态递归是可能的,我相信它会起作用。但我对不涉及多态递归的替代实现持开放态度。

我已经研究过这个问题,但仍然不足:
  • https://byorgey.wordpress.com/2007/08/16/mapping-over-a-nested-functor/
  • http://okmij.org/ftp/Haskell/typecast.html#deepest-functor
  • Haskell Polymorphic Recursion with Composed Maps causes Infinite Type Error
  • 最佳答案

    已经有一种从现有值计算新值的类型——函数。假设我们有一个索引结构的函数,我们可以通过将它应用于结构来使用它来索引结构。

    (!!!) = flip ($)

    infixr 2 !!!

    如果我们有一个索引结构的函数和另一个索引任何嵌套结构的函数,我们可以通过 fmap 将它们组合在一起。在结构上执行第二个函数,然后应用外部函数。
    (!.) :: Functor f => (f b -> g c) -> (a -> b) -> f a -> g c
    t !. f = t . fmap f

    infixr 5 !.

    带有示例 3d 结构
    three_d_tensor :: [[[(Int,Int,Int)]]]
    three_d_tensor = [[[(x, y, z) | z <- [0..4]] | y <- [0..3]] | x <- [0..2]]

    我们可以查找使用您的切片函数构建的精细切片 slicingstepping .
    example = three_d_tensor !!! slicing 1 2 !. stepping 2 !. stepping 2 . slicing 1 3

    这导致
    [[[(1,0,1),(1,0,3)],[(1,2,1),(1,2,3)]],[[(2,0,1),(2,0,3)],[(2,2,1),(2,2,3)]]]

    关于haskell - 在 Haskell 中复制 Numpy 的高级索引/切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32630035/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com