2013-06-12 18 views
19

"input_array"と "select_id"から "output_array"を取得する方法はありますか?列インデックスでナンシー配列の各行で1つの要素を選択

range(input_array.shape[0])を取り除くことはできますか?

>>> input_array = numpy.array([ [3,14], [12, 5], [75, 50] ]) 
>>> select_id = [0, 1, 1] 
>>> print input_array 
[[ 3 14] 
[12 5] 
[75 50]] 

>>> output_array = input_array[ range(input_array.shape[0]), select_id ] 
>>> print output_array 
[ 3 5 50] 
+1

それはそれを行うの病気の方法だ、間違いないあなたが持っているものよりも良いが、 'np.diagonal(input_array [:, select_id])'もあなたを取得します '配列([3、5 、50]) '。これらの値を出力する代わりに – Jaime

答えて

29

あなたはインデックス配列から配列を作成しnumpy.chooseを使用して指定された配列の中から選択すると、(あなたのケースinput_array中)アレイのセット(あなたのケースselect_idに)選択することができます。ただし、最初に寸法を一致させるためにinput_arrayを転記する必要があります。以下は、小さな例を示します。

In [101]: input_array 
Out[101]: 
array([[ 3, 14], 
     [12, 5], 
     [75, 50]]) 

In [102]: input_array.shape 
Out[102]: (3, 2) 

In [103]: select_id 
Out[103]: [0, 1, 1] 

In [104]: output_array = np.choose(select_id, input_array.T) 

In [105]: output_array 
Out[105]: array([ 3, 5, 50]) 
+0

を使用します。 – syllogismos

+0

あなたはこれを使うことができますhttp://stackoverflow.com/questions/7761393/how-to-modify-a-2d-numpy-array-at-specific-locations-without-a-loop – Steven

0

方法について:

[input_array[x,y] for x,y in zip(range(len(input_array[:,0])),select_id)] 
+0

私は数学をする必要があります多くのデータだから私はnumpyでベクトル化しようとします。 – Bystander

2

私はenumerateが便利だと思います。

[input_array[enum, item] for enum, item in enumerate(select_id)] 
+0

インラインループによる時間節約は常に素晴らしいです。私は本当に多くのデータを処理するためにnumpyが必要です... – Bystander

1

あなたが32のまたは少ない選択肢(この場合は、あなたの次元を持っている場合にのみnumpy.choose

注作品(私は受け入れ答えにコメントとしてこれを投稿することができないため)インデックスに沿った配列は、サイズが32以下でなければなりません)。さらに、numpy.chooseのdocumentationには、誤解の可能性を減らすために、以下の「乱用」が名目上サポートされているにもかかわらず、選択肢が単一の配列ではなく、コンテナはリストまたはタプルのいずれかでなければなりません。

OPが求められます。

  1. は "input_array" と "select_id" から "output_array" を得るためのより良い方法はありますか?
    • 私は、あなたが当初提案した方法は、ここに提示された方法の中で最高のようだと言います。理解しやすく、大規模な配列にスケールアップし、効率的です。
  2. 範囲(input_array.shape [0])を取り除くことはできますか?
    • はい、他の回答でも示されていますが、受け入れられたものは一般的にOPが既に提案しているようにうまく機能しません。
+1

それは非常に長いコメントだったでしょう;) –

+1

ハ、答えとして何かを書くとき、私はそれがちょうど長くなると思う。そして私は、OPの質問に直接対処することによってそれを "答え"にする義務を感じました。 – Nathan

関連する問題