[英]Convert 2d-array to 2d-array of unique values per row
我有一個形狀為 5x4 的二維數組,如下所示:
array([[3, 3, 3, 3],
[3, 3, 3, 3],
[3, 3, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2]])
我想獲得另一個包含唯一值的 arrays 的數組,如下所示:
array([array([3]), array([3]), array([2, 3]), array([2]), array([2])],
dtype=object)
我通過以下代碼獲得了它:
np.array([np.unique(row) for row in matrix])
但是,這不是矢量化的。 如何在矢量化 numpy 操作中實現相同的效果?
numpy
arrays 必須具有已定義的形狀,因此,如果您的數據對於某些行只有1
值,而對於其他行只有2
或更多值,那么這是行不通的。 一種解決方法是用已知值填充數組,例如。 np.nan
。
在這種情況下, np.unique
將為您解決所有問題。 如果你使用它的axis
參數。 在這種情況下,您希望每行具有唯一值,因此我們使用axis=1
:
arr = np.array([[3, 3, 3, 3],
[3, 3, 3, 3],
[3, 3, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2]])
np.unique(arr, axis=1)
>>> array([[3, 3],
[3, 3],
[2, 3],
[2, 2],
[2, 2]])
結果是一個數組,每行都有正確的唯一值,盡管有些是重復的,但這是擁有一個數組的代價。
這是迭代時最小化計算的一種方法,應該有助於提高性能 -
b = np.sort(a,axis=1)
o = np.ones((len(a),1), dtype=bool)
mask = np.c_[o,b[:,:-1] != b[:,1:]]
c = b[mask]
out = np.split(c, mask.sum(1).cumsum())[:-1]
使用slicing
的循環可能比np.split
更好。 因此,在每次迭代中,我們所做的只是切片。 因此,最后一步可以用這樣的東西代替 -
idx = np.r_[0,mask.sum(1).cumsum()]
out = []
for (i,j) in zip(idx[:-1],idx[1:]):
out.append(c[i:j])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.