如何计算特定抽象 n 维 NumPy 数组中元素的数量?

How to count the amount of elements in a particular abstract n-dimensional NumPy array?

我打算计算一个特定的抽象 n 维数组中存储了多少整数(我不确定这个的正确术语)。例如,这是名为 'result':

的 numpy 数组的输出
In [1]: print(f"{result} \n {type(result)}")
Out [1]: [list([[[[2, 5], [6, 8]]], [[[[5, 7], [8, 9]]], [[[7, 8], [9, 9]]]]]) list([[[8, 9], [9, 2]]])] 
<class 'numpy.ndarray'>

然后,如何计算该“结果”上的元素数。预期结果是 16,因为“结果”变量中存储了 16 个整数(2、5、6、8、...、8、9、9、2)?

result.size 会告诉您 NumPy 数组中有多少个元素(参见 numpy.ndarray.size)。问题是你的数组不仅仅是一个数组,但出于某种原因,它是一个列表列表的列表....

您需要做的第一件事是清理数据,这样您的数组中就没有这些 list 类型了。然后result.size会做你想做的。

您有一个包含列表的 2 元素对象数据类型数组:

In [68]: result = np.array([list([[[[2, 5], [6, 8]]], [[[[5, 7], [8, 9]]], [[[7, 8], [9, 9]]]]]), list([[[8, 9
    ...: ], [9, 2]]])], object)
In [71]: print(result)
[list([[[[2, 5], [6, 8]]], [[[[5, 7], [8, 9]]], [[[7, 8], [9, 9]]]]])
 list([[[8, 9], [9, 2]]])]
In [72]: result.shape
Out[72]: (2,)

第二个列表可以做成一个(2,2)数组,有4个元素:

In [73]: np.array(result[1])
Out[73]: 
array([[[8, 9],
        [9, 2]]])
In [74]: np.array(result[1]).size
Out[74]: 4

但是第一个元素中的列表嵌套更深:

In [75]: np.array(result[0], object)
Out[75]: 
array([list([[[2, 5], [6, 8]]]),
       list([[[[5, 7], [8, 9]]], [[[7, 8], [9, 9]]]])], dtype=object)
In [76]: np.array(np.array(result[0], object)[0])
Out[76]: 
array([[[2, 5],
        [6, 8]]])
In [77]: np.array(np.array(result[0], object)[1])
Out[77]: 
array([[[[5, 7],
         [8, 9]]],


       [[[7, 8],
         [9, 9]]]])
In [78]: _.shape
Out[78]: (2, 1, 2, 2)

一个是(2,1,2)形,另一个是(2,1,2,2)。那是4个和8个元素,所以总共16个。

我们可以编写一个遍历元素的递归函数,确定它是否到达“底部”或是否需要向下移动另一层。

还有一种“扁平化”列表的方法(itertools.chain?),但即便如此我们也需要递归地使用它。


In [80]: import itertools
In [81]: list(itertools.chain(*result))
Out[81]: 
[[[[2, 5], [6, 8]]],
 [[[[5, 7], [8, 9]]], [[[7, 8], [9, 9]]]],
 [[8, 9], [9, 2]]]
In [82]: len(_)
Out[82]: 3
In [83]: [list(itertools.chain(*x)) for x in Out[81]]
Out[83]: [[[2, 5], [6, 8]], [[[5, 7], [8, 9]], [[7, 8], [9, 9]]], [8, 9, 9, 2]]
In [84]: len(_)
Out[84]: 3
In [85]: list(itertools.chain(*Out[83]))
Out[85]: [[2, 5], [6, 8], [[5, 7], [8, 9]], [[7, 8], [9, 9]], 8, 9, 9, 2]

编辑

最近how to remove brackets from these individual elements?

得到一个副本 link How to make a flat list out of a list of lists?

它有许多函数(大部分是递归的)可以展平任意深度的列表。拿第一

In [100]: def flatten(itr):
     ...:     for x in itr:
     ...:         try:
     ...:             yield from flatten(x)
     ...:         except TypeError:
     ...:             yield x
In [101]: list(flatten(result))
Out[101]: [2, 5, 6, 8, 5, 7, 8, 9, 7, 8, 9, 9, 8, 9, 9, 2]
In [102]: len(_)
Out[102]: 16