2016-07-22 22 views
0

私はアクセスしたい特定の値を持つ配列xを持っています。そのインデックスは別の配列によって与えられます。他の配列で効率的にインデックスを付ける配列

例えば、x

array([[ 0, 1, 2, 3, 4], 
[ 5, 6, 7, 8, 9], 
[10, 11, 12, 13, 14], 
[15, 16, 17, 18, 19], 
[20, 21, 22, 23, 24]]) 

であり、インデックスはNx2の

idxs = np.array([[1,2], [4,3], [3,3]]) 

のアレイであるIはxの配列を返す関数を希望[1,2]、[X 4,3]、x [3,3]または[7,23,18]である。次のコードはこのトリックを行いますが、おそらくforループを避けることで、大規模な配列の速度を上げたいと思います。

import numpy as np 

def arrayvalsofinterest(x, idx): 
    output = np.zeros(idx.shape[0]) 
    for i in range(len(output)): 
     output[i] = x[tuple(idx[i,:])] 
    return output 

if __name__ == "__main__": 
    xx = np.arange(25).reshape(5,5) 
    idxs = np.array([[1,2],[4,3], [3,3]]) 
    print arrayvalsofinterest(xx, idxs) 
+1

や 'X [idxs [すなわちアレイのビューを使用するよりも少ないメモリ効率的である:0]、[:, idxs 1]] '?詳細はこちら - http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing – Divakar

+0

@Divakar Haha、ページを更新するたびに更新していますちょうどそれを書いた:) – Alex

答えて

3

あなたはaxis0座標の反復可能とaxis1座標の反復可能で渡すことができます。 the Numpy docs hereを参照してください。

i0, i1 = zip(*idxs) 
x[i0, i1] 

@Divakarコメントで指摘したように、これは

x[idxs[:, 0], idxs[:, 1]] 
+0

@Divakarうん、あなたは正しい! – Alex

関連する問題