我正在尝试在指定维度内规范化数组 (归一化是指将每个元素除以相关维度的总和)。
我想以某种方式自动化计算,其中给出了标准化数组的维度, 并且使用相同的函数为每个函数生成输出。虽然我可以产生所需的金额,但我不能 使用一致的技术将它们标准化。
安姆韦
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)
虽然最好不要使用循环(包括 apply 等),但欢迎任何解决方案。谢谢
按照评论中的要求,提供一个矩阵示例(如果只是 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
最佳答案
您寻求的一致性可以通过使用 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)
简化为数组你想要的。
关于arrays - 标准化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37800768/