[英]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 ,那么:
解釋一下為什么每列(不是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.