簡體   English   中英

在每一行中查找唯一值

[英]Finding unique values in each row

我有一個大小為 2 的字符串的數組,並希望在每一行中獲取唯一的字符串。

np.__version__
# '1.19.2'
arr = np.array([['Z7', 'Q4', 'Q4'], # 2 unique strings
                ['Q4', 'Z7', 'Q4'], # 2 unq strings
                ['Q4', 'Z7', 'Z7'], # 2 unq strings
                ['Z7', 'Z7', 'Q4'], # 2 unq strings
                ['D8', 'D8', 'L1'], # 2 unq strings
                ['L1', 'L1', 'D8']], dtype='<U2') # 2 unq strings

保證每行包含相同數量的唯一字符串,即每行將具有相同數量的唯一字符串,在我的情況下為 2。

預期 output

array([['Q4', 'Z7'],
       ['Q4', 'Z7'],
       ['Q4', 'Z7'],
       ['Q4', 'Z7'],
       ['D8', 'L1'],
       ['D8', 'L1']], dtype='<U2')

在這里,每一行都進行了排序,但不是必須的。 兩種方式都很好。

我的代碼:

np.apply_along_axis(np.unique, 1, arr)

# array([['Q4', 'Z7'],
#        ['Q4', 'Z7'],
#        ['Q4', 'Z7'],
#        ['Q4', 'Z7'],
#        ['D8', 'L1'],
#        ['D8', 'L1']], dtype='<U2')

我認為軸 1 上的np.unique會給出預期的結果,但是

np.unique(arr, axis=1)
# array([['Q4', 'Q4', 'Z7'],
#        ['Q4', 'Z7', 'Q4'],
#        ['Z7', 'Z7', 'Q4'],
#        ['Q4', 'Z7', 'Z7'],
#        ['L1', 'D8', 'D8'],
#        ['D8', 'L1', 'L1']], dtype='<U2')

我不明白到底發生了什么以及為什么它返回了這個確切的 output。

這是因為 numpy.unique 將行或列子數組展平,然后返回唯一的行(軸 = 0)或列(軸 = 1),而不是唯一值本身。 看看這個例子:

a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
np.unique(a, axis=0)

output 是:

array([[1, 0, 0], [2, 3, 4]])

b = np.array([[1, 1, 0], [1, 1, 0], [2, 2, 4]])
np.unique(b, axis=1)

output 是:

array([[0, 1],
       [0, 1],
       [4, 2]])

在您的情況下,您需要每行本身的唯一值,因此應該像您已經實現的那樣應用 along_axis 命令。 axis = 1 的作用不大,因為您的列都是唯一的,並且只顯示一些排序。

np.unique的文檔,在參數的描述中,包含以下語句:

...由給定軸索引的子數組將被展平視為一維數組的元素

因此,如果您調用 np.unique,傳遞axis=1 ,那么:

  • 每一都被展平(因為每一列都包含“原子”值,所以什么也沒有發生)。
  • 對結果列表(列列表)執行唯一元素的查找。 如果 2 列完全相同,則只會保留其中的一列。
  • 結果可能以更改的順序呈現(這是內部實現細節。

解釋一下為什么每(不是row ):軸“1”實際上是“列”。

為了確認在這種情況下每一都是進程 object,將源數組定義為:

arr_2 = np.array([['Z7', 'Q4', 'Q4', 'Q4'],
                  ['Q4', 'Z7', 'Q4', 'Q4'],
                  ['Q4', 'Z7', 'Z7', 'Z7'],
                  ['Z7', 'Z7', 'Q4', 'Q4'],
                  ['D8', 'D8', 'L1', 'L1'],
                  ['L1', 'L1', 'D8', 'D8']])

其中最后 2 列是一樣的。

當您執行np.unique(arr_2, axis=1)時,結果將是一樣的。 最后兩完全相同,因此其中一個已被淘汰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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