2016-03-20 6 views
2

にnumpyの行列をフィルタリング私はnumpyの行列を有する:私が欲しいもの次のようにカラム

data = np.matrix(
     "5 3 1;" 
     "4 4 1;" 
     "6 4 1;" 
     "8 2 1;" 
     "3 5 1;" 
     "1 7 1;" 
     "5 4 1;" 
     "0 1 0;" 
     "2 0 0") 
# Output: 
matrix([[5, 3, 1], 
    [4, 4, 1], 
    [6, 4, 1], 
    [8, 2, 1], 
    [3, 5, 1], 
    [1, 7, 1], 
    [5, 4, 1], 
    [0, 1, 0], 
    [2, 0, 0]]) 

は、その値が1である3番目の列にマトリクスをフィルタリングすることです。それは私がその第三値要するに0です、私は以下の行列を抽出したい行を取得する必要はありません、次のとおりです。

matrix([[5, 3, 1], 
    [4, 4, 1], 
    [6, 4, 1], 
    [8, 2, 1], 
    [3, 5, 1], 
    [1, 7, 1], 
    [5, 4, 1]]) 

私はそれをフィルタリングするためのいくつかの組み合わせを試してみました。彼らのどれも私のために働いていませんでした。たとえば、次のコードでは行はゼロで除外されますが、最初の列のみが返されます。

data[data[:,2]>0] 
#Output: 
matrix([[5, 4, 6, 8, 3, 1, 5]]) 

ループステートメントを明示的に記述しなくてもこのマトリックスをフィルタリングする方法はありますか?

答えて

5

は、次のような簡単なマスクのインデックス作成を行うことができます:

a = a[a[:, 2] != 0] 

np.matrixからあなたが行うことができますnp.arrayに変換するには:

a = np.asarray(a)  
+3

[ 'A = aA'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.A.html#numpy.matrix.A):でHICH結果行列の 'a = np.asarray(a)'と等価です。 :) – MSeifert

0

どうにかして、np.matrixは異常な動作をします。行列の行が1行行列であるため、配列に対して有効な私の解は行列では機能しません。なぜ明示的に行列を使用したいのですか?

さて、この作品:

data = np.matrix(
     "5 3 1;" 
     "4 4 1;" 
     "6 4 1;" 
     "8 2 1;" 
     "3 5 1;" 
     "1 7 1;" 
     "5 4 1;" 
     "0 1 0;" 
     "2 0 0") 

data = np.array(data) 
print data[data[:, 2] > 0] 

私も働く、filter(lambda x: x[0, 2] > 0, data)を使用しようとしましたが、私は良い形に戻って変換することはできません1×3行列のリストを返します。 np.array代わりのnp.matrixを使用して

1

それとも使用:

import numpy as np 

a = np.matrix([[5, 3, 1], 
    [4, 4, 1], 
    [6, 4, 1], 
    [8, 2, 1], 
    [3, 5, 1], 
    [1, 7, 1], 
    [5, 4, 1], 
    [0, 1, 0], 
    [2, 0, 0]]) 
ind = np.squeeze(np.asarray(a[:,2]))>0 

print(a[ind,:]) 

、w

[[5 3 1] 
    [4 4 1] 
    [6 4 1] 
    [8 2 1] 
    [3 5 1] 
    [1 7 1] 
    [5 4 1]]