2016-07-21 8 views
0

Xの形の数字が(768, 8)です。PythonのPython配列から行を抽出します

各行の最後の値は、私が唯一の値1を持つ行をしたい、0または1こと、およびこのTを呼び出すことができます。

私がやった:

T = [x for x in X if x[7]==1] 

をこれが正しい、しかし、これは今リスト、ないnumpyの配列(実際に私はT.shapeを印刷することはできません)です。

これをnumpyの配列にする代わりに、どうすればよいですか?あなたがリストとしてT作っている

T = [x for x in X if x[8]==1] 

を呼び出すことによって

+1

理由だけではなく、 'T = np.array(T)'? – ThePredator

+0

さて、Tのコードを保存してnumpyの配列に戻してください。 – user

答えて

2

numpyののブールインデックスは完全にベクトル化された方法で仕事を取得します。このアプローチは、リスト内包表記と型変換を使用するよりも、一般的に効率的(そしておそらくエレガント)です。

T = X[X[:, -1] == 1] 

デモ:

In [232]: first_columns = np.random.randint(0, 10, size=(10, 7)) 

In [233]: last_column = np.random.randint(0, 2, size=(10, 1)) 

In [234]: X = np.hstack((first_columns, last_column)) 

In [235]: X 
Out[235]: 
array([[4, 3, 3, 2, 6, 2, 2, 0], 
     [2, 7, 9, 4, 7, 1, 8, 0], 
     [9, 8, 2, 1, 2, 0, 5, 1], 
     [4, 4, 4, 9, 6, 4, 9, 1], 
     [9, 8, 7, 6, 4, 4, 9, 0], 
     [8, 3, 3, 2, 9, 5, 5, 1], 
     [7, 1, 4, 5, 2, 4, 7, 0], 
     [8, 0, 0, 1, 5, 2, 6, 0], 
     [7, 9, 9, 3, 9, 3, 9, 1], 
     [3, 1, 8, 7, 3, 2, 9, 0]]) 

In [236]: mask = X[:, -1] == 1 

In [237]: mask 
Out[237]: array([False, False, True, True, False, True, False, False, True, False], dtype=bool) 

In [238]: T = X[mask] 

In [239]: T 
Out[239]: 
array([[9, 8, 2, 1, 2, 0, 5, 1], 
     [4, 4, 4, 9, 6, 4, 9, 1], 
     [8, 3, 3, 2, 9, 5, 5, 1], 
     [7, 9, 9, 3, 9, 3, 9, 1]]) 
+1

さらに明示的または間接的なオーバーヘッドにX.compress(マスク、軸= 0)を使用することもできます。マスクの代わりに行インデックスを使用する場合は、X.take(rowxs、axis = 0)を使用できます。 Numpyのファンシーインデックスは、これらの機能をフードの下で呼びます。 – Erotemic

+0

ありがとう、それはまた私に何かを教えている – user

0

。それをnumpyの配列に任意のリストを変換するには、単に使用します。

T = numpy.array([x for x in X if x[8]==1]) 

ここでは何が起こるかです:

In [1]: import numpy as np 

In [2]: a = [1,2,3,4] 

In [3]: a.T 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-3-9f69ed463660> in <module>() 
----> 1 a.T 

AttributeError: 'list' object has no attribute 'T' 

In [4]: a = np.array(a) 

In [5]: a.T 
Out[5]: array([1, 2, 3, 4]) 

In [6]: 
+0

だから、リストへの中間の通路が必要であり、数値の低い行列に戻る必要があります。直接変換はありません。 – user

+0

@user:編集を確認します。 'numpy.array(x [x]がx [8] == 1ならばxのxの場合)' – ThePredator

+0

はい、それは同じです。私はちょうど好ましいnumpy操作があったかどうか疑問に思っていた。とにかく、これは、ありがとう、動作します。 – user

関連する問題