NumPy:如何过滤矩阵行

2024-05-16 01:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的numpy,在尝试筛选样本子集时遇到问题。

我有一个形状为(1000, 12)的矩阵。也就是说,一千个样本,每个样本有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),也就是说,一个包含所有离群行的矩阵,但每个离群行中包含所有数据列?


Tags: 数据numpy元素normeval矩阵条件max
2条回答
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]])

也许像这样的方法会奏效?

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

请参阅advanced indexing上的文档。

相关问题 更多 >