2014-12-05 41 views
2

在MATLAB和numpy中,可以通過索引數組索引矢量並獲得相同形狀的結果,例如,通過R中的數組索引矢量

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

請注意,如果a具有維度,則矩陣索引是完全不同的,索引列應用於a的變暗以返回nrow(b)向量。 – mdsumner 2014-12-05 23:54:20

回答

2

不能通過子集在R(據我所知)僅指定尺寸。這裏是一個解決辦法:

`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

這是不是很優雅,但它的工作原理

matrix(a[b],nrow=nrow(b)) 
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很容易遵循和清潔。