2017-03-15 4 views
1

3Dアレイ)(n_samples、)である各サンプルについて選択された成分である。numpyの私は<em>n_samples</em> = 5と<em>num_components</em> = 7</p> <p>私は別の配列を有する(<strong>インデックス</strong>以下の例では、3D numpyのアレイ(<strong>n_samples第X num_components X 2</strong>)を有する割り出し

結果の配列がn_samples x 2になるようにインデックスを指定してデータ配列から選択したいとします。

コードは以下である:

import numpy as np 
np.random.seed(77) 
data=np.random.randint(low=0, high=10, size=(5, 7, 2)) 
indices = np.array([0, 1, 6, 4, 5]) 
#how can I select indices from the data array? 

がデータ0については、例えば、選択されたコンポーネントは、第0であるべきであり、選択されたコンポーネント1データ1.

注意すべきであることを私ができません私はTheanoでそれを使用しているため、任意のforループを使用し、ソリューションはnumpyにのみ基づいている必要があります。

答えて

3

これはあなたが探しているものですか?

In [36]: data[np.arange(data.shape[0]),indices,:] 
Out[36]: 
array([[7, 4], 
     [7, 3], 
     [4, 5], 
     [8, 2], 
     [5, 8]]) 
+0

ええ、そうです。私はこれが最高の答えだと思います。 – Ash

2

我々は、すべての軸0上のエントリ(サンプル)、及び軸1上にのみエントリ#0(成分)、および残りの軸に暗黙的にすべてを取得

data[:, 0] 

すなわちを使用し、成分#0を取得します。

これは、簡単に関連するすべてのコンポーネントを選択するように

data[:, indices] 

に一般化することができます。


しかし、どのようなOPが本当に望んでいるが、diagonal機能を使用して抽出することができ、高次元配列の対角すなわち(data[0, indices[0]], (data[1, indices[1]]), ...)この配列のちょうど対角です:

>>> np.diagonal(data[:, indices]) 
array([[7, 7, 4, 8, 5], 
     [4, 3, 5, 2, 8]]) 

(あなたはする必要があるかもしれません結果を転置)

+0

data [:、indices]は形状が(5、5、2)になりますが、(5,2)の形状が必要です。 – Ash

+0

@Afshin 'data [:, 0]'は、単一のコンポーネントに対して '(5、2)'です。 5つのコンポーネントを持っているときに ''(5、2) '配列を使いたいですか? – kennytm

+0

各サンプル(第1の次元)に対して7つの2次元成分がある。我々は、各サンプルについて、これら7つの成分のうちの1つの指標を知っている。各サンプルが対応する2次元成分を選択することを望む。データ[:、0]は正しいものですが、3番目のサンプルの7番目の成分(インデックス6)を返す必要があるのに対して、すべてのサンプルに対して0成分を返すだけです。 – Ash

1

をあなたがそうするためのさまざまな方法を持っているが、これは私のループ推奨です:。

selection = np.array([ datum[indices[k]] for k,datum in enumerate(data)]) 

結果の配列selectionは、望ましい形状を持っています。

+0

私はTheanoを使用しているので私はループのために使用することができません、唯一のnumpyソリューションが必要です。 – Ash

+1

私はあなたが元の投稿にその制約を加えるべきだと思います。 –

関連する問題