Python多维数组 - 计算非零项数量的最有效方法

6 投票
7 回答
11933 浏览
提问于 2025-04-16 07:42

大家好,今天是个有趣的周六晚上,

我最近在学习Python,感觉挺不错的。

假设我有一个Python数组:

x = [1, 0, 0, 1, 3]

请问有什么最快的方法来计算这个列表中所有非零元素的数量(答案是:3)?我希望尽量不使用for循环,能用最简洁的方式来实现,比如说类似于

[counter += 1 for y in x if y > 0]

现在,我真正的问题是我有一个多维数组,我真的不想这样做:

for p in range(BINS):
    for q in range(BINS):
        for r in range(BINS):
            if (mat3D[p][q][r] > 0): some_feature_set_count += 1

根据我看到的Python知识,我觉得应该有一种非常简洁(而且高效)的方法来实现这个。

有没有人有好的想法?

7 个回答

2

如果你使用的是numpy,并且你的三维数组是一个numpy数组,那么这行代码就能解决问题:

numpy.where(your_array_name != 0, 1, 0).sum()

举个例子:

In [23]: import numpy

In [24]: a = numpy.array([ [[0, 1, 2], [0, 0, 7], [9, 2, 0]], [[0, 0, 0], [1, 4, 6], [9, 0, 3]], [[1, 3, 2], [3, 4, 0], [1, 7, 9]] ])

In [25]: numpy.where(a != 0, 1, 0).sum()
Out[25]: 18
3

如果你在使用 numpy,这说明你在Python中使用多维数组。下面的内容和@Marcelo的回答类似,但稍微简洁一些:

>>> a = numpy.array([[1,2,3,0],[0,4,2,0]])
>>> sum(1 for i in a.flat if i)
5
>>>
12

对于一维的情况:

sum(1 for i in x if i)

对于多维的情况,你可以选择嵌套:

sum(sum(1 for i in row if i) for row in rows)

或者把所有内容都放在一个结构里:

sum(1 for row in rows
      for i in row if i)

撰写回答