矩阵中每行特定情况的计数

Clé*_*aud 4 python numpy

我对 numpy 和科学计算相当陌生,我为一个问题苦苦挣扎了好几天,所以我决定将其发布在这里。

我正在尝试获取 numpy 数组中某个条件的特定出现次数的计数。

In [233]: import numpy as np

In [234]: a= np.random.random([5,5])

In [235]: a >.7
Out[235]: array([[False,  True,  True, False, False],
   [ True, False, False, False,  True],
   [ True, False,  True,  True, False],
   [False, False, False, False, False],
   [False, False,  True, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

我想计算True每行中出现的次数并在该计数达到某个阈值时保留行:

前任 :

results=[]
threshold = 2

for i,row in enumerate(a>.7):
  if len([value for value in row if value==True]) > threshold:
     results.append(i) # keep ids for each row that have more than 'threshold' times True 
Run Code Online (Sandbox Code Playgroud)

这是代码的非优化版本,但我很想用 numpy 实现同样的效果(我有一个非常大的矩阵要处理)。

我一直在尝试各种方法,np.where但只能得到平坦的结果。我需要行号

提前致谢 !

alk*_*lko 5

为了使结果可重复,请使用一些种子:

>>> np.random.seed(100)
Run Code Online (Sandbox Code Playgroud)

然后对于样本矩阵

>>> a = np.random.random([5,5])
Run Code Online (Sandbox Code Playgroud)

使用总和计算沿轴出现的次数:

>>> (a >.7).sum(axis=1)
array([1, 0, 3, 1, 2])
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式获取行号np.where

>>> np.where((a > .7).sum(axis=1) >= 2)
(array([2, 4]),)
Run Code Online (Sandbox Code Playgroud)

要过滤结果,只需使用布尔索引:

>>> a[(a > .7).sum(axis=1) >= 2]
array([[ 0.89041156,  0.98092086,  0.05994199,  0.89054594,  0.5769015 ],
       [ 0.54468488,  0.76911517,  0.25069523,  0.28589569,  0.85239509]])
Run Code Online (Sandbox Code Playgroud)

  • 不需要使用“where”提取索引,您可以使用布尔数组直接对行进行索引,即“a[(a > .7).sum(axis=1) >= 2]”应该执行相同的操作,并且布尔索引往往是最快的。 (2认同)