【发布时间】:2014-03-03 09:47:45
【问题描述】:
我想要一个沿给定轴标准化数组的函数。基本上,我希望能够写的是:
apply(X, axis, normalize)
它应该按行、列、...或沿第 n 个维度对我的数组进行规范化。
这听起来像是一个很常见的问题,但 R 似乎无法在不使用 quirks 的情况下解决它。
考虑以下矩阵和函数:
> m = matrix(1:4,nrow=2,dimnames=list(c('a','b'),c('x','y')))
> m
x y
a 1 3
b 2 4
normalize=function(X) {
X = X - mean(X)
X = X/sd(X)
return(X)
}
如果我将apply() 与轴号一起使用,结果如下:
> apply(m, 2, normalize)
x y
a -0.7071068 -0.7071068
b 0.7071068 0.7071068
一切正常
> apply(m, 1, normalize)
a b
x -0.7071068 -0.7071068
y 0.7071068 0.7071068
这里,矩阵已经转置(这是我不想要的)。我想保留 n 维数组的原始维度。
不起作用的可能答案是:
- 使用
t(),跨行应用,然后转回:这不适用于多维数组 - 使用y包的x函数:可能同上
- 为每个维度写一个
if子句:解决方案应该是普遍适用的,而不仅仅是一些硬编码的情况
编辑:根据罗兰的建议,我将使用以下函数代替apply:
array_apply = function(X, along, FUN) {
X = as.array(X)
ndim = c(1:length(dim(X)))
preserveAxes = ndim[ndim != along]
orderAxes = c(along, preserveAxes)
X = apply(X, preserveAxes, FUN)
return(aperm(X, orderAxes))
}
其行为方式如下:
> m = matrix(1:4,nrow=2,dimnames=list(c('a','b'),c('x','y')))
> array_apply(m,1,normalize)
x y
a -0.7071068 -0.7071068
b 0.7071068 0.7071068
> array_apply(m,2,normalize)
x y
a -0.7071068 0.7071068
b -0.7071068 0.7071068
【问题讨论】:
标签: r multidimensional-array normalization