【问题标题】:racket: equivalent to np.zeros((n, m))球拍:相当于 np.zeros((n, m))
【发布时间】:2018-07-12 00:05:56
【问题描述】:

我不明白我在这里做错了什么。可能是错位的反引号。

球拍代码:

(require math/array)
(define mask_cube
  (let ([leng 5])
    `(make-array #(,leng ,leng) 0)))

我想要它做什么,用python写的:

np.zeros((5,5))

为什么逗号没有像我认为的那样工作?如果有更优雅的方法来解决问题,请告诉我。大多数情况下,我只想要我漂亮、简短的 np.zeros() 函数

此外,如果我对反引号、逗号或球拍(甚至一般的 Lisp)有一些基本的误解,请告诉我。

【问题讨论】:

    标签: python numpy lisp racket backquote


    【解决方案1】:

    你不想在这里eval。相反,您引用的太多了;解决您的问题的简单方法是将` 向内移动到适当的位置:

    (define mask_cube
      (let ([leng 5])
        (make-array `#(,leng ,leng) 0)))
    

    但是,如果您是初学者,我通常会避免引用;它比它需要的更复杂。改用vector函数就行了,更容易理解:

    (define mask_cube
      (let ([leng 5])
        (make-array (vector leng leng) 0)))
    

    对于引用的深入处理(最后带有准引用),请参阅What is the difference between quote and list?

    【讨论】:

    • 我喜欢反引号的简洁。此外,我以前做过一点口齿不清,只是出于练习。感谢修改!
    【解决方案2】:

    哇,我是不是觉得自己很蠢。它总是一样的:评估的内容与只是符号列表的内容。答案(见eval):

    (define mask_cube
      (let ([leng 5])
        (eval
          `(make-array #(,leng ,leng) 0))))
    

    仍然对使用更好样式编码的其他答案持开放态度,并希望将其修改为将np.zeros()np.ones() 转换为Lisp 的函数/宏

    【讨论】:

    • 如果您使用的是eval,那么您就犯了一个错误。
    • 想想你将如何在 python 中做到这一点很有趣。我认为是eval("np.zeros([{}, {}])".format(5, 5)。我认为eval 是多么可怕。
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2012-01-23
    • 2023-03-08
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多