[R] apply on a 4D array
Benjamin.STABLER@odot.state.or.us
Benjamin.STABLER at odot.state.or.us
Thu Sep 25 20:19:07 CEST 2003
I am trying to multiply a 3D array of 4x4x4 by the 4 3D arrays of a 4D array
with dimensions 4x4x4x4 (the last dimension being the one that I want to
split by).
(4x4x4 array)
> hiaAry
, , a1
i1 i2 i3 i4
h1 9.5936098 6.001040 0.08772 0.3138600
h2 1.2003500 1.454570 2.79248 0.0000000
h3 0.1346500 0.201220 0.39256 0.5464000
h4 0.0109000 0.012270 0.16417 0.2766900
, , a2
i1 i2 i3 i4
h1 195.08275 74.23508453 39.23165 14.89689
h2 1.80127 7.41649055 6.97972 2.77784
h3 0.00000 0.27444002 0.77353 6.10322
h4 0.01554 0.01232000 0.40669 3.69832
, , a3
i1 i2 i3 i4
h1 25.81161 13.57603931 6.40551 1.38103
h2 2.61562 2.26407003 2.13906 1.41652
h3 0.05780 0.30406001 1.15228 0.00000
h4 0.00000 0.04258000 0.22346 0.43209
, , a4
i1 i2 i3 i4
h1 59.47618 16.54495 0.00000000 0.00000
h2 1.50265 2.76623 0.00000000 0.08917
h3 0.00000 0.42722 0.00000000 1.29230
h4 0.00000 0.00000 0.07564002 0.34235
(4x4x4x4 array)
dim "wX" is the dimension that I want to split the array by.
> probAry
, , a1, w1
i1 i2 i3 i4
h1 0.3784811 0.17321659 0.11236581 0.157227931
h2 0.2569944 0.08635110 0.03812272 0.036192191
h3 0.1659365 0.04928920 0.01856106 0.015686506
h4 0.0939886 0.02551057 0.00846568 0.006614069
, , a2, w1
i1 i2 i3 i4
h1 0.3227855 0.14088002 0.090150394 0.127416178
h2 0.2181195 0.07210281 0.032273293 0.031203848
h3 0.1409469 0.04170138 0.015971840 0.013690984
h4 0.0804619 0.02189455 0.007375192 0.005817293
, , a3, w1
i1 i2 i3 i4
h1 0.7558389 0.5157448 0.39155036 0.4867531
h2 0.6611814 0.3640772 0.20821663 0.2126003
h3 0.5494104 0.2540337 0.11997469 0.1092745
h4 0.4100844 0.1566448 0.06143343 0.0507088
, , a4, w1
i1 i2 i3 i4
h1 0.9445381 0.8542088 0.7797483 0.8391612
h2 0.9234338 0.7957714 0.6755850 0.7172834
h3 0.8941212 0.7257939 0.5631331 0.5815922
h4 0.8487089 0.6284291 0.4226977 0.4107244
, , a1, w2................................
I thought it would be something along the lines of apply(4Darray, c(1,2,3),
function(x) x*3Darray). But this returns the results in the form of 64rows
by dim1 by dim2 by dim3.
, , i4, a4
h1 h2 h3 h4
[1,] 8.05058486 6.881337e+00 5.579569e+00 3.940329195
[2,] 0.19306289 2.185652e-01 2.347175e-01 0.219540239
.
.
.
[63,] 0.00000000 1.300468e-01 2.430320e-01 0.395577205
[64,] 0.00000000 0.000000e+00 1.191559e-02 0.034329350
It looks like the rows are all the combinations of the 4th dimension with
the other dimensions. So then I thought I could array it back to the
dimensions I want and maybe use aperm if I needed to. But there must be a
better way to do this. I can of course just multiple the 3D array by each
3D cube of the 4D array with a loop...but that would be inefficient.
I thought maybe sweep(4Darray, 4, 3Darray, "*"), but that returns different
results than multiplying each 3D array by each 3D cube of the 4D array. I
guess what I am asking is for some clarification on apply and sweep. I have
read the manuals and searched the list, but I can't seem to find much about
operations with 3 or more dimensions. Thanks.
Ben Stabler
More information about the R-help
mailing list