球拍:O(1) 数组索引像 python 的 numpy?



我在python中使用图片数组(二维数组(和模型数组(三维数组(数据,用于在三维中建模人体的应用程序。我想重写Lisp中的代码,特别是Racket、

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

即。

arr[1,2] = 1

球拍应该怎么做?

使用数组而不是(链接的(列表的全部意义在于,您可以在恒定时间内随机访问索引。但是Racket数组提供的远不止这些,包括Python风格的切片和NumPy风格的数组范围操作。语法没有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中不应该像在Racket中那样将其作为两个索引表达式来编写,所以它更详细的事实并不是一件坏事。

无论哪种方式,它都具有相同的恒定时间查找。

编辑:查看已接受的答案

对于香草列表,您可以进行

(list-tail lst pos)

另请参阅:https://docs.racket-lang.org/reference/pairs.html

最新更新