如何计算一个列表中超出我们标准的元素,该列表位于一个列表中,该列表也位于一个列表中(深度为 4 个列表(?)的列表)?

How to count an element that exceed our criteria in a list that is in a list that is also in a list (a list with a depth of 4 lists (?))?

我正在尝试计算有多少元素超过了某些标准(例如:0.7),然后将它们转换为百分比,该元素在一个多重列表中,如下所示:

[[[[0.00173012]
   [0.0009075 ]
   [0.00080378]
   ...
   [0.00069336]
   [0.00074539]
   [0.00186453]]

  [[0.00081442]
   [0.00022855]
   [0.00019197]
   ...
   [0.00018318]
   [0.00017222]
   [0.00075811]]

  [[0.00084458]
   [0.00020444]
   [0.0001783 ]
   ...
   [0.00020849]
   [0.00017066]
   [0.00070635]]

  ...

  [[0.00073932]
   [0.00022051]
   [0.00024553]
   ...
   [0.00028661]
   [0.00019603]
   [0.0007242 ]]

  [[0.00085666]
   [0.0002345 ]
   [0.00021651]
   ...
   [0.0002319 ]
   [0.00017067]
   [0.00066847]]

  [[0.00188439]
   [0.00092146]
   [0.00082662]
   ...
   [0.00077084]
   [0.00066442]
   [0.00178707]]]]

信息: 有...因为它是一个长列表并且无法将所有列表放入输出单元格(它本来是一个图像)

我试过使用:

len(pex > 0.7)/100
#pex is variable contain the multiple list above

但这并没有真正起作用,因为 len 的输出只是 1,如果我将它除以 100,输出将只是 0.01

有什么方法可以让我轻松计算出所有元素和超过某些条件的元素,以便我可以将它们转换为百分比?? TIA

如果您被允许使用 numpy 这很容易做到,请考虑以下示例

import numpy as np
data = [[[1,2],[3,4]],[[5,6],[7,8]]]
arr = np.array(data) # create numpy.array
print(np.sum(arr>5)) # count elements > 5
print(arr.size) # number of all elements

输出

3
8

解释:将嵌套列表转换为 numpy.array 使用比较得到 same-shaped 数组 Trues 其中值大于 5 和 Falses 其他地方,然后使用 numpy.sum (not built-in sum function) 获取计数,因为 TrueFalse 被视为 10 进行算术运算时(这也适用于 numpy 之外,例如 sum([True,True,True]) 给出 3

我不确定为什么选择这个数据结构,但在我看来,将列表和子列表展平到一个包含所有元素的列表中然后对其执行操作看起来更简单:

def flatten(l):
    res = []
    for el in l:
        if type(el) == list:
            #If it's a list then we extract all the elements in it
            res.extend(flatten(el))
        else:
            #Only add in the result the non-list elements
            res.append(el)
    return res

dex = [[[[0.00173012],
         [0.0009075 ],
         [0.00080378],
         [0.00069336],
         ....
         [0.00074539],
         [0.00186453]]]]

flatten_dex = flatten(dex) 
#Here flatten_dex is [0.00173012, 0.0009075, 0.00080378, 0.00069336, ..., 0.00074539, 0.00186453]

一旦你有了这个列表,计算符合条件的元素数量就简单多了:

nb_elements_greater_than_0_8 = len([e for e in flatten_dex if e > 0.8])
number_of_total_elements = len(flatten_dex)