racket:像 python 的 numpy 一样 O(1) 数组索引?

问题描述 投票:0回答:2

我在 python 中使用图片数组(2 维数组)和模型(3 维数组)数据来构建 3 维人体建模的应用程序。我想用 Lisp 重写代码,特别是 Racket,

但我想知道 numpy 索引中的表达式如何简洁,即。

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

即。

arr[1,2] = 1

应该如何在球拍中完成?

python arrays scheme racket
2个回答
3
投票

使用Arrays而不是(链接)列表的全部意义在于,您可以在恒定时间内随机访问它们的索引。但 Racket Arrays 提供的功能远不止这些,包括 Python 风格的切片和 NumPy 风格的数组范围操作。语法不像 Python 那样简洁或(至少在我看来)那么好,但思想是相同的。

你确实需要阅读整章来理解编写代码的最佳方式,否则你最终会做同样的事情,就好像你编写了使用 NumPy 的 Python 代码,然后循环了

range(len(arr))
所有内容时间。

但是要回答你的直接问题,Python/NumPy 表达式:

arr[2, 3]

…在 Racket 中写为:

(array-ref arr #(2 3))

Python 表达式:

arr[2][3]

… 被写成两个嵌套的

array-ref
调用。但是,如果
arr
是一个实际的 2D 数组(例如,来自 NumPy),那么您不应该像在 Racket 中那样在 Python 中将其编写为两个索引表达式,因此它更冗长的事实并不重要确实是一件坏事。

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


0
投票

编辑:查看已接受的答案

对于普通列表,你可以这样做

(list-tail lst pos)

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

© www.soinside.com 2019 - 2024. All rights reserved.