【问题标题】:How to extract n-1 dimension array from a n-dimension array thanks to a n-1 dimension array and without a loop?由于n-1维数组且没有循环,如何从n维数组中提取n-1维数组?
【发布时间】:2015-03-11 10:18:18
【问题描述】:

我的问题很简单,但我似乎找不到解决方案。 我有一个 n 维数组 A,由于索引 C 的 n-1 维数组,我想提取 n-1 维数组 B。 如果没有循环,我怎么能做到?

例如:

A=array(1:12, dim=c(2,3,2))
A
, , 1
      [,1] [,2] [,3]
 [1,]    1    3    5
 [2,]    2    4    6

  , , 2
       [,1] [,2] [,3]
 [1,]    7    9   11
 [2,]    8   10   12

C=array(c(1,2,2,1,1,2),dim=c(2,3))
C
      [,1] [,2] [,3]
 [1,]    1    2    1
 [2,]    2    1    2

最后我想找到 B(类似于“A[,,C]”)

B
      [,1] [,2] [,3]
 [1,]    1    9    5
 [2,]    8    4    12

好像我已经完成了

B 
           [,1]                 [,2]              [,3]
 [1,]    A[1,1,C[1,1]]   A[1,2,C[1,2]    A[1,3,C[1,3]]
 [2,]    A[2,1,C[2,1]]   ...

我必须在 5 个维度上执行此操作,所以如果我可以避免制作循环...

谢谢。

【问题讨论】:

  • 没人能帮我吗?
  • 我不明白你是如何获得B的。能详细点吗?
  • 当然,C 是第三维的索引数组。例如 B[1,1] = A[1,1, C[1,1]]

标签: arrays r multidimensional-array


【解决方案1】:

我将通过索引计算来解决这个问题:通过将0:(length(C)-1) 添加到A 的每个 [.,.,i]-slice(在您的情况下为 i=1,2),您可以获得第一个切片的索引。如果之前将C-1C 的长度相乘,然后添加1,您还将获得所有其他切片的正确索引。 -1+1 操作相互补偿,因此我们可以非常简短地表达这一点:

ind <- as.vector((C-1) * length(C) + 1:length(C))
array(A[ind], dim = dim(C))

【讨论】:

  • 谢谢,但如果我的问题是 5 个维度,而要提取的维度是第四个?我可以用什么?
【解决方案2】:

你也可以试试

library(reshape2)
matrix(A[as.matrix(melt(C))], ncol=ncol(C))
#      [,1] [,2] [,3]
#[1,]    1    9    5
#[2,]    8    4   12

【讨论】:

  • “融化”功能完美地满足了我的需求。谢谢!
【解决方案3】:

另一种解决方案:

B<-A[cbind(c(row(C)),c(col(C)),c(C))]
dim(B)<-dim(C)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多