NumPy:如何过滤矩阵行

5
我是新手numpy ,尝试筛选样本的子集时遇到了麻烦。
我有一个形状为(1000,12)的矩阵。也就是说,每个样本有一千个数据,每个数据都有十二个数据列。我想创建两个矩阵,一个包含所有离群值的样本,另一个包含所有不是离群值的元素。产生的矩阵应该具有这个形状:
norm.shape     = (883, 12)
outliers.shape = (117, 12)

为了识别异常值,我使用以下条件:

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

即对于矩阵中的每一行,我寻找两列的值。如果其中一列高于某个阈值,则该行被视为异常值。关键在于,此条件具有形状(1000,),因此当我压缩原始矩阵时,得到一个(117,)的结果。如何过滤矩阵,使结果为(117,12)?也就是说,获得所有异常行的矩阵,但每行都包含所有数据列?

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]])

让我们过滤掉第二列中小于零的所有行:

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]])

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)

请查看 高级索引 相关文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接