Skip to content

array extraction

4 messages · robin hankin, Simon Knapp, (Ted Harding)

#
hello everyone.

Look at the following R idiom:

 a <- array(1:30,c(3,5,2))
 M <- (matrix(1:15,c(3,5)) %% 4) < 2
 a[M,] <- 0

Now, I think that "a[M,]" has an unambiguous meaning (to a human).
However, the last line doesn't work as desired, but I expected it
to...and it recently took me an indecent amount of time to debug an
analogous case.  Just to be explicit, I would expect a[M,] to extract
a[i,j,] where M[i,j] is TRUE.  (Extract.Rd is perfectly clear here, and R is
behaving as documented).

The best I could cobble together was the following:

 ind <- which(M,arr.ind=TRUE)
 n <- 3
 ind <- cbind(kronecker(ind,rep(1,dim(a)[n])),rep(seq_len(dim(a)[n]),nrow(ind)))
 a[ind] <- 0


but the intent is hardly clear, certainly compared to "a[M,]"

I've been pondering how to implement such indexing, and its
generalization.

Suppose 'a' is a seven-dimensional array, and M1 a matrix and M2 a
three-dimensional array (both Boolean).  Then "a[,M1,,M2]" is a
natural generalization of the above.  I would want a[,M1,,M2] to
extract a[i1,i2,i3,i4,i5,i6,i7] where M1[i2,i3] and M[i5,i6,i7] are
TRUE.

One would need all(dim(a)[2:3] == dim(M1)) and all(dim(a)[5:7] ==
dim(M2)) for consistency.

Can any R-devel subscribers advise?
#
thank you Simon.

I find a[M] working to be unexpected, but consistent with (a close
reading of) Extract.Rd

Can we reproduce a[,M]?

[I would expect this to extract a[,j,k] where M[j,k] is TRUE]

try this:
[1]  1  4  7 10 11 14 17 20 21 24 27 30

This is not doing what I would want a[,M] to do.




I'll checkout afill() right now....

best wishes


Robin
On Wed, Sep 28, 2011 at 10:39 AM, Simon Knapp <sleepingwell at gmail.com> wrote:

  
    
#
Somewhat out of my depth here (I have only 2 arms, but am
swimming in waters which require 3): My interpretation is
that a and M are basically vectors, with dimension attributes,
accessed down the columns.

The array 'a' consists of 30 elements 1:30 in that order,
accessed by each of 3 rows for each of 5 columns in each
of two "layers", in that order of precedence.

The matrix M consusts of 15 elements, accessed by each
of 35 rows for each of 5 columns.

Thus a(M) treats M as an selection vector, ignoring dimension,
and reads along a and at the same time along M, selecting
according to TRUE of FALSE. Then, when it gets to the end
of the first "layer" in 'a' it re-cycles M.

When I tried a[M,] I got

  a[M,]
  # Error in a[M, ] : incorrect number of dimensions

I infer that it is treating the M as a vector, so there
are only 2 dimensions in a[M,] instead of 3. So try:

  a[M,,]
  # Error: (subscript) logical subscript too long

which is not surprising since one is applying a 15-long
selector to the first dimension of 'a', which has only
length 3, just as in

  a[rep(TRUE,15),,]
  # Error: (subscript) logical subscript too long

which, interestingly, differs from

  a[rep(1,15),,]
  # (Output, which is what you'd expect, omitted)

(Hmm, out of my depth again ... ).

Well, maybe two arms is not enough when you need three
to swim in these waters; but it seems that one long swishy
tail will do nicely. That being said, I still find the
water quite murky!
Ted.
On 27-Sep-11 22:12:26, robin hankin wrote:
--------------------------------------------------------------------
E-Mail: (Ted Harding) <ted.harding at wlandres.net>
Fax-to-email: +44 (0)870 094 0861
Date: 28-Sep-11                                       Time: 00:28:37
------------------------------ XFMail ------------------------------