计数只包含零而没有循环的数组

时间:2017-03-27 09:37:12

标签: python arrays numpy count counting

我使用Numpy并将此数组用于示例:

error:
[[-1.  0.  0.  0.  0.  0.  0.  0.  1.  0.]
 [ 0. -1.  0.  0.  0.  0.  0.  0.  1.  0.]
 [ 1. -1.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0. -1.  0.  0.  0.  0.  0.  0.  1.  0.]
 [-1.  0.  0.  0.  0.  0.  0.  0.  1.  0.]
 [-1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [-1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [-1.  1.  0.  0.  0.  0.  0.  0.  0.  0.]
 [-1.  0.  0.  0.  0.  0.  0.  0.  1.  0.]
 [-1.  1.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1. -1.  0.  0.  1.  0.  0.  0.  0.  0.]
 [-1.  0.  0.  0.  0.  0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1. -1.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1. -1.  0.  0.  0.  0.  0.  0.  0.  0.]
 [-1.  0.  0.  0.  0.  0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]

现在我想计算内部数组中只包含零的数量,但是没有编写循环函数。

他们有任何可能的解决方案吗?

我知道我可以使用,一个in range(len(error))次迭代的循环,然后一行一行地检查np.sum(abs(error[i]))>0但是我想要一个更好的解决方案。

4 个答案:

答案 0 :(得分:1)

这将完成这项工作:

a=np.array([[0.,1.,0.],[-1.,0.,0.],[0.,0.,0.]])
np.sum(np.abs(a).sum(axis=1)<1e-5)

结果为1,确实只有一行所有元素都为0.另外,我将1e-5作为错误术语包含在内(因为你的数字是浮点而不是整数)。

此外,如果您的矩阵a实际上只包含刚写为浮点数的整数(如您的示例所示),您还可以执行以下操作:

a=np.array([[0.,1.,0.],[-1.,0.,0.],[0.,0.,0.]])
a=a.astype(int)
len(a)-np.count_nonzero(np.abs(a).sum(axis=1))

结果是1。

答案 1 :(得分:0)

您可以尝试使用np.bincount(数据)。

这是一个例子:

m = np.array([[0,0,1,2,3,4,0,6]]
data = np.apply_along_axis(lambda x: np.bincount(x,minlength=2), axis=1, arr=m)

然后只需选择您想要的一个数据,在您的情况下,数据[0]

答案 2 :(得分:0)

以下方法为您提供了所有非零的行索引:

In [25]: arr
Out[25]:
array([[ 0,  0,  0,  0, -1,  0,  0,  0,  1,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0, -1,  0,  0,  0, -1,  0,  0,  0,  0],
       [ 0,  0,  0, -1,  1,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  1,  0, -1,  0,  0,  0,  0],
       [-1,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, -1,  0,  0, -1,  0,  0, -1],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0, -1,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  1],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  1,  0,  0],
       [-1,  0,  0,  0,  0,  0,  0,  0,  0,  0]])

然后使用np.where组合布尔掩码和np.sum

In [26]: np.where((arr !=  0).sum(axis=1) == 0)
Out[26]: (array([ 1,  2,  3,  4,  5,  8, 11, 12, 14, 17]),)

答案 3 :(得分:0)

如果您正在寻找all 0.而不是sum==0.,这就是您所需要的:

a =  [[1., 0., 1.], [0., 0., 0.], [-1., 0., 1.]]

result = len([item for item in a if set(item)==set([0.])])