5

私はnumpyを初めて使用し、サンプルのサブセットをフィルタリングしようとして問題が発生します。

形の行列があります(1000, 12)。つまり、それぞれに12個のデータ列がある1000個のサンプルです。2つの行列を作成します。1つはサンプル内のすべての外れ値を含み、もう1つは外れ値ではないすべての要素を含みます。結果の行列は次の形状になります。

norm.shape     = (883, 12)
outliers.shape = (117, 12)

外れ値を特定するために、次の条件を使用しています。

cond_out  = (dados[0:,RD_EVAL] > _max_rd) | (dados[0:,DUT_EVAL] > _max_dut)

つまり、マトリックスの各行について、2つの列の値を探しています。それらの1つが特定のしきい値を超えている場合、その線は外れ値と見なされます。重要なのは、この条件には形(1000,)があるので、元の行列を圧縮すると(117,)結果が得られるということです。(117,12)結果が外れ値であるが、各行にすべてのデータ列がある行列になるように、行列をフィルター処理するにはどうすればよいですか?

4

2 に答える 2

14
import numpy as np

d=np.random.randn(4,4)

array([[ 1.16968447, -0.07650322, -0.30519481, -2.09278839],
       [ 0.53350868, -0.8004209 ,  0.38477468,  1.31876924],
       [ 0.06461366,  0.82204993,  0.42034665,  0.30473843],
       [ 1.13469745, -1.47969242,  2.36338208, -0.33700972]])

2 番目の列で 0 未満のすべての行をフィルター処理します。

d[:,1]<0
array([ True,  True, False,  True], dtype=bool)

ご覧のとおり、目的の行を選択するために使用できる論理配列を取得します。

d[d[:,1]<0,:]

array([[ 1.16968447, -0.07650322, -0.30519481, -2.09278839],
       [ 0.53350868, -0.8004209 ,  0.38477468,  1.31876924],
       [ 1.13469745, -1.47969242,  2.36338208, -0.33700972]])
于 2012-08-14T13:30:15.213 に答える
3

たぶん、このようなものがうまくいくでしょうか?

>>> import numpy
>>> m = numpy.random.random(size=(1000,12))
>>> RD_EVAL = 7
>>> _max_rd = 0.9
>>> DUT_EVAL = 11
>>> _max_dut = 0.95
>>> cond_out = (m[:,RD_EVAL] > _max_rd) | (m[:,DUT_EVAL] > _max_dut)
>>> cond_out.shape
(1000,)
>>> 
>>> norm = m[~cond_out, :]
>>> outliers = m[cond_out,:]
>>> 
>>> norm.shape
(846, 12)
>>> outliers.shape
(154, 12)

高度なインデックス作成に関するドキュメントを参照してください。

于 2012-08-14T13:29:36.460 に答える