我打算計算有多少整數存盤在一個特定的抽象 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)?
uj5u.com熱心網友回復:
result.size將告訴您 NumPy 陣列中有多少元素(請參閱numpy.ndarray.size)。問題是您的陣列不僅僅是一個陣列,而且由于某種原因它是一個串列串列的陣列......
你需要做的第一件事是清理你的資料,這樣list你的陣列中就沒有這些型別了。然后result.size會做你想做的。
uj5u.com熱心網友回復:
您有一個 2 元素物件 dtype 陣列,其中包含串列:
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]
編輯
最近如何從這些單個元素中洗掉括號?
got a duplicate link How to make a flat list out of a list of lists?
That has a number of functions (mostly recursive) that flatten a list of arbitrary depth. Taking the first
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433829.html
標籤:Python 数组 麻木的 numpy-ndarray
