Как функция развертки R работает с многомерным массивом? - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь понять, как функция развертки работает с многомерными массивами (4d, 5d ...), особенно когда поле равно кортежу dims c (1,2), c (1,3) ...

например:

x<-array(1,dim = c(2,3,4,5))
sweep(x, STATS=_, MARGIN= c(1,2), FUN='*')

Какими должны быть размеры STATS здесь? и как это работает?

1 Ответ

1 голос
/ 13 мая 2019

Размеры статистики, приведенные в STATS, должны совпадать с размерами, полученными в результате MARGIN изменения данных во входном массиве или, хотя это и не рекомендуется, размера, кратного числуэлементы в этом результате (например, длина 2 в массиве 2x3; или массив 2x4 в массиве 2x4x3; или массив 2x2 в массиве 2x4x3 и т. д.).

Чтобы понять размеры, полученные в результате MARGIN изменяя данные, давайте рассмотрим пример:

# Example data in a 3D array of size 2x3x4
set.seed(1717)
x = array(runif(2*3*4), c(2,3,4))

# We MARGINalize the data by computing the mean on all dimensions *other than*
# the stated ones: (1, 3)
# This gives a 2D result whose dimension is of size
# "length of dim 1" x "length of dim 3", i.e. 2x4
marginalize_on_dims = c(1,3)
m = apply(x, marginalize_on_dims, mean)

, который приводит к следующему массиву 2x4 "означает":

> m
          [,1]      [,2]     [,3]      [,4]
[1,] 0.3662613 0.2971481 0.155660 0.5121214
[2,] 0.5808111 0.7322553 0.662044 0.4984720

Теперь мы вычеркнем вычисленные средние значения mиз исходного массива x:

x_swept_out_of_means_m = sweep(x, STATS=m, MARGIN=marginalize_on_dims)

, что приводит к:

> x_swept_out_of_means_m
, , 1

           [,1]       [,2]      [,3]
[1,] -0.2934119 -0.3224825 0.6158943
[2,] -0.4540748  0.1814070 0.2726678

, , 2

           [,1]      [,2]        [,3]
[1,] -0.1452443 0.3631910 -0.21794673
[2,] -0.1205201 0.0873856  0.03313448

, , 3

              [,1]        [,2]        [,3]
[1,] -0.0766162667 -0.14700413  0.22362039
[2,]  0.0006661599  0.05828265 -0.05894881

, , 4

           [,1]       [,2]       [,3]
[1,]  0.2341822 -0.4071083  0.1729261
[2,] -0.2680816  0.4772658 -0.2091843

Теперь отметим, что в сводке по полученному результату показано среднее значение 0, котороесоответствует вычитанию среднего:

> summary(x_swept_out_of_means_m)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-0.45407 -0.21137 -0.02914  0.00000  0.19196  0.61589 

Поэтому в вашем примере, поскольку вы маргинализуете измерения 1 и 2, вам следует использовать значение STATS, имеющее измерение 2x3, например:

x <- array(1, dim=c(2,3,4,5))
sweep(x, STATS=matrix(nrow=c(2,3), data=c(2,3,-2,4,0,-3)), MARGIN=c(1,2), FUN='*')

whПрежде чем результатом должен быть массив 2x3x4x5 со следующим массивом 2x3, повторенным 4x5 раз:

         [,1] [,2] [,3]
[1,]    2   -2    0
[2,]    3    4   -3

Информация о сеансе:

> sessionInfo()
R version 3.5.2 (2018-12-20)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...