我是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)
,也就是说,所有行都是异常值的矩阵,但是每个行都包含所有数据列?
答案 0 :(得分:12)
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]])
答案 1 :(得分: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)
请参阅advanced indexing上的文档。