【问题标题】:Normalise an array规范化一个数组
【发布时间】:2016-06-13 23:36:07
【问题描述】:

我正在尝试规范化指定维度内的数组 (归一化是指将每个元素除以相关维度的总和)。

我想以某种方式自动化计算,其中给出了规范化数组的维度, 并且相同的函数用于为每个生成输出。虽然我可以生成所需的总和,但我不能 使用一致的技术对它们进行标准化。

一个人

a = array(1:8, c(2,2,2))

dm = 1 # dimension to sum over
ndim = length(dim(a))
margin = setdiff(seq_len(ndim), dm) # dimensions to keep in apply
a / rep(apply(a, margin, sum), each=2)

, , 1

          [,1]      [,2]
[1,] 0.3333333 0.4285714
[2,] 0.6666667 0.5714286

, , 2

          [,1]      [,2]
[1,] 0.4545455 0.4666667
[2,] 0.5454545 0.5333333


dm = 3 # dimension to sum over
ndim = length(dim(a))
margin = setdiff(seq_len(ndim), dm) 
a / rep(apply(a, margin, sum), times=2)
# but for this dimension `times`, instead of `each` was used

, , 1

          [,1]      [,2]
[1,] 0.1666667 0.3000000
[2,] 0.2500000 0.3333333

, , 2

          [,1]      [,2]
[1,] 0.8333333 0.7000000
[2,] 0.7500000 0.6666667


#for dim=2 the denominator is more difficult to generate
dm = 2 # dimension to sum over
a / c(4,6,4,6,12,14,12,14)

虽然最好不要使用循环(包括应用等),但欢迎任何解决方案。谢谢


根据 cmets 的要求,一个矩阵示例(如果它只是 2x2 数组,这将更直接)

a = array(1:4, c(2,2))
a
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
dm = 1 # dimension to sum over
ndim = length(dim(a))
margin = setdiff(seq_len(ndim), dm) # dimensions to keep in apply
apply(a, margin, sum)
# [1] 3 7
a / rep(apply(a, margin, sum), each=2)
#          [,1]      [,2]
#[1,] 0.3333333 0.4285714
#[2,] 0.6666667 0.5714286

dm = 2 # dimension to sum over
ndim = length(dim(a))
margin = setdiff(seq_len(ndim), dm) # dimensions to keep in apply
apply(a, margin, sum)
# [1] 4 6
a / rep(apply(a, margin, sum), times=2)
#          [,1]      [,2]
#[1,] 0.2500000 0.7500000
#[2,] 0.3333333 0.6666667

【问题讨论】:

  • 您能否举一个 2x2 矩阵、给定维度、使用该矩阵和维度计算的总和以及相应的归一化矩阵的示例?
  • @cameronroytaylor;我已经更新了,你

标签: arrays r


【解决方案1】:

你寻求的一致性可以通过sweep获得:

normalize <- function(a,dm){
  ndim <- length(dim(a))
  margin <- setdiff(seq_len(ndim),dm)
  sweep(a,margin,apply(a, margin, sum),"/")
}

然后将normalize(a,1)normalize(a,2)normalize(a,3) 简化为您想要的数组。

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2019-10-03
    相关资源
    最近更新 更多