簡體   English   中英

將二維數組轉換為每行唯一值的二維數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM