我有一個嵌套的 numpy 陣列 - 它包含許多其他 numpy 子陣列,但子陣列的長度不同。主陣列arr_main如下所示:
>>> print(main_arr)
array([[array([3.5525, ..., 4.0138, 4.0139], dtype=float32)],
[array([3.5525, ..., 4.0138, 4.0139], dtype=float32)],
...
[array([3.5525, ..., 4.0138, 4.0139], dtype=float32)]],
dtype=object)
我想要做的是只從大的主陣列中提取唯一的子陣列,所以我想做一些類似的事情
np.unique(main_arr)
但這會導致錯誤訊息ValueError: operands could not be broadcast together with shapes (4613,) (4615,)。我猜,這是由于某些子陣列的長度不同。
如何從中提取唯一的子陣列main_arr?如果您知道一些不依賴于 numpy 的解決方案,也將不勝感激!tnx
uj5u.com熱心網友回復:
您可以使用字典按長度重新組合陣列,然后僅提取唯一的陣列。
for array in main_arr:
n = array.size
if n in d:
d[n].append(array)
else:
d[n] = np.array([array])
new_array = np.empty()
for k in d.keys():
new_array.append(np.unique(d[k]))
然而,提取唯一陣列是一個繁重的演算法......
uj5u.com熱心網友回復:
numpy unique 函式適用于一維陣列,但您可以部署一些邏輯來獲取唯一陣列的陣列:
import numpy as np
# Create example array of sub arrays
a = np.array([
np.array([1, 2, 3]), np.array([4, 5, 6, 7]),
np.array([1, 2, 3]), np.array([4, 5, 6, 7])])
# Build array of unique sub arrays
unique = []
for sub_a in a:
if not any([np.array_equal(i, sub_a) for i in unique]):
unique.append(sub_a)
unique_array = np.array(unique)
uj5u.com熱心網友回復:
您可能想更多地考慮可以比較哪些專案組main_arr以識別它們是否有重復項。這個問題不言自明。您需要按您輸入的陣列長度對其進行分組main_arr。之后,您可以呼叫np.unique這些組。
main_arr = np.array([np.array([3.5525, 3.7895, 4.0139], dtype=float),
np.array([3.5525, 3.7895, 4.0139], dtype=float),
np.array([3.5525, 4.0138, 4.0139, 4.1], dtype=float),
np.array([3.5525, 4.0138, 4.0139], dtype=float),
np.array([3.5525, 4.0138, 4.0139, 4.1], dtype=float),
np.array([3.5525, 3.7895, 4.0138, 4.0139, -1], dtype=float)], dtype=object)
from itertools import groupby
groups = [list(g) for k,g in groupby(sorted(main_arr, key=len), len)]
# (...) instead of [...] is a better choice in order to avoid double iteration
>>> groups
[[array([3.5525, 3.7895, 4.0139]),
array([3.5525, 3.7895, 4.0139]),
array([3.5525, 4.0138, 4.0139])],
[array([3.5525, 4.0138, 4.0139, 4.1 ]),
array([3.5525, 4.0138, 4.0139, 4.1 ])],
[array([ 3.5525, 3.7895, 4.0138, 4.0139, -1. ])]]
>>> [np.unique(g, axis=0) for g in groups]
[array([[3.5525, 3.7895, 4.0139],
[3.5525, 4.0138, 4.0139]]),
array([[3.5525, 4.0138, 4.0139, 4.1 ]]),
array([[ 3.5525, 3.7895, 4.0138, 4.0139, -1. ]])]
您可以連接所有這些陣列,但是numpy如果您這樣做,您將有另一個資料結構處理不是專為它設計的。
注意:我稍微更改了初始資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372131.html
上一篇:具有矩陣行的元素明智乘法向量
