代码之家  ›  专栏  ›  技术社区  ›  Nathan majicvr.com

球拍:O(1)数组索引,像Python的NUMPY?

  •  0
  • Nathan majicvr.com  · 技术社区  · 7 年前

    我在python中使用图片数组(二维数组)和模型数据数组(三维数组)作为一个应用程序,在这个应用程序中,我在三维中建模人体。我想用lisp重写代码,特别是racket,

    但我想知道如何简洁的表达式在NUMPY索引,即。 arr[2][3] 将用Lisp表示。我可以写一个递归函数来扩展 (car (car ... (car list)))) (cdr (cdr ... (cdr list)))) ,但这似乎效率低下。有办法得到 O(1) lisp列表、向量或数组中的访问时间?

    即。

    arr[1,2] = 1
    

    球拍应该怎么做?

    2 回复  |  直到 7 年前
        1
  •  2
  •   abarnert    7 年前

    使用的全部要点 Arrays 与(链接)列表不同的是,您可以在固定时间内随机访问它们的索引。但是racket数组提供了更多的功能,包括python-ish切片和numpy-ish数组范围的操作。语法并不像python那样简洁(至少在我看来是这样),但是思想是一样的。

    你真的需要阅读整章来理解编写代码的最佳方式,否则你最终会做同样的事情,就像你编写的python代码使用了numpy,但是循环了 range(len(arr)) 总是。

    但是要回答您的直接问题,python/numpy表达式:

    arr[2, 3]
    

    用racket写成:

    (array-ref arr #(2, 3))
    

    python表达式:

    arr[2][3]
    

    写为两个嵌套 array-ref 电话。但是如果 arr 是一个实际的2D数组(例如,从NUMPY),在Python中,你不应该把它作为两个索引表达式来写,而不是在你的球拍中,所以事实上它更冗长并不是一件坏事。

    不管怎样,它都有相同的常量时间查找。

        2
  •  0
  •   user9588242user9588242    7 年前

    编辑:见接受答案

    对于香草列表,您可以

    (list-tail lst pos)
    

    另见: https://docs.racket-lang.org/reference/pairs.html