球拍中的数组操作:错误"expected indexes for shape '(6); given '#(6)"



在写这个问题之前,我试图将我的代码简化到导致错误的部分,并且简化的代码有效......所以我将从这个开始:

此代码应采用每个 x 值,并使用 x 的值递增索引处的 y 条目。它突变了ys。请参阅下面的代码示例。

#lang racket
(require math/array)
(define xs (array #[5 1 3 1]))
(define ys (mutable-array #[0 0 0 0 0 0 0 0 0 0]))
(define result (array-map (λ (x) (array-set! ys
                                         (vector x)
                                         (add1 (array-ref ys (vector x)))))
                      xs))
>> ys
(mutable-array #[0 2 0 1 0 2 0 0 0 0])

现在,这是当这个问题标题中出现错误时我正在编写的代码:

第一个函数接受一个未排序的数组并找到其中的最大值。

(define (make-auxiliary-array unsorted)
  (local ((define size-for-aux (array-ref (array-axis-max unsorted 0)
                                          #()))) 
    (array->mutable-array (make-array (vector size-for-aux) 0))))

第二个函数类似于顶部的工作代码。唯一的区别似乎是我在本地定义和使用数组。称为辅助的数组类似于顶部工作代码片段中的 ys。

(define (count-instances unsorted)
  (local ((define auxiliary (make-auxiliary-array unsorted)))
    (array-map (λ (u) (array-set! auxiliary
                                  (vector u)
                                  (add1 (array-ref auxiliary (vector u)))))
               unsorted)))
>> (count-instances (array #[3 6 4 1 3 4 1 4]))
array-ref: expected indexes for shape '(6); given '#(6)

问题:

  1. 为什么(计数实例(函数有错误,但结果值没有?

  2. 我发现我需要使用 (向量 u( 从值制作索引。为什么我应该使用向量而不是(数组 u(?

  3. 这也许应该是一个完全独立的问题,但为什么(数组 #[42](与(数组 42(不同?

您的示例不起作用的原因是#(6)不是形状的有效索引 #(6)#(0)#(1) , ...从#(5)到都是有效的索引,但就像向量或列表索引一样,它们从0n - 1

问题出在size-for-aux make-auxiliary-array.表达式 (array-ref (array-axis-max unsorted 0) #()) 是最大索引的大小,但size-for-aux必须比这多一个,即(add1 (array-ref (array-axis-max unsorted 0) #()))

你的例子是:

#lang racket
(require math/array)
(define (make-auxiliary-array unsorted)
  (local ((define size-for-aux (add1 (array-ref (array-axis-max unsorted 0)
                                                #()))))
    (array->mutable-array (make-array (vector size-for-aux) 0))))
(define (count-instances unsorted)
  (local ((define auxiliary (make-auxiliary-array unsorted)))
    (array-map (λ (u) (array-set! auxiliary
                                  (vector u)
                                  (add1 (array-ref auxiliary (vector u)))))
               unsorted)))
(count-instances (array #[3 6 4 1 3 4 1 4]))

但是,这会产生(array #[#<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void>]),因为您从未真正返回auxiliary。所以你可能的意思是:

(define (count-instances unsorted)
  (local ((define auxiliary (make-auxiliary-array unsorted)))
    (array-map (λ (u) (array-set! auxiliary
                                  (vector u)
                                  (add1 (array-ref auxiliary (vector u)))))
               unsorted)
    auxiliary))
(count-instances (array #[3 6 4 1 3 4 1 4]))

这会产生(mutable-array #[0 2 0 3 3 0 1]).

嗯。我期待(mutable-array #[0 2 0 2 3 0 1]).如果这是你真正想要的,你还有更多的东西要弄清楚,但那将是一个不同的问题。

相关内容

最新更新