在MATLAB和numpy中,您可以通过索引数组索引向量并获得相同形状的结果,例如
A = [1 1 2 3 5 8 13];
B = [1 2; 2 6; 7 1; 4 4];
A(B)
## ans =
##
## 1 1
## 1 8
## 13 1
## 3 3
或
import numpy as np
a = np.array([1, 1, 2, 3, 5, 8, 13])
b = np.reshape(np.array([0, 1, 1, 5, 6, 0, 3, 3]), (4, 2))
a[b]
## array([[ 1, 1],
## [ 1, 8],
## [13, 1],
## [ 3, 3]])
但是,在R中,通过索引数组索引向量会返回一个向量:
a <- c(1, 1, 2, 3, 5, 8, 13)
b <- matrix(c(1, 2, 7, 4, 2, 6, 1, 4), nrow = 4)
a[b]
## [1] 1 1 13 3 1 8 1 3
R中是否有惯用的方法来执行保留数组形状的矢量化查找?
答案 0 :(得分:2)
这不是很优雅,但它有效
matrix(a[b],nrow=nrow(b))
答案 1 :(得分:2)
您无法在R(AFAIK)中单独通过子集指定尺寸。这是一个解决方法:
`dim<-`(a[b], dim(b))
产地:
[,1] [,2]
[1,] 1 1
[2,] 1 8
[3,] 13 1
[4,] 3 3
dim<-(...)
只允许我们将尺寸设置功能dim<-
用于其结果,而不是通常情况下的副作用。
您还可以执行以下操作:
t(apply(b, 1, function(idx) a[idx]))
但这会很慢。
答案 2 :(得分:1)
选项1:如果我们不需要将原始值保留在b中,我们可以简单地
"Caveat: the values in b will be over-written"
b[] = a[b]
b
# [,1] [,2]
# [1,] 1 1
# [2,] 1 8
# [3,] 13 1
# [4,] 3 3
选项2:如果想要保留b中的值,可以采用简单的解决方法
c = b # copy b to c
c[] = a[c]
c
# [,1] [,2]
# [1,] 1 1
# [2,] 1 8
# [3,] 13 1
# [4,] 3 3
实际上我发现选项2很容易理解和清理。