簡體   English   中英

argsort 多維數組中的所有元素

[英]Argsort all elements in a multidimensional array

是否可以對一個考慮所有值的多維數組進行 argsort (考慮所有軸)? 例如,

A = [[[4,11],[7,5]],
     [[6,1],[8, 9]]] 

argsort(A)=[[[1,7],[4,2]],
            [[3,0],[5,6]]] 

這是一種方法:

import numpy as np

A = np.array([[[4, 11], [7, 5]], [[6, 1], [8, 9]]])

# First, make a flat argsort
sorting = A.flatten().argsort()  # array([5, 0, 3, 4, 2, 6, 7, 1])

# Let's create an array to gather the result
result = np.zeros(A.size, dtype=int)  # array([0, 0, 0, 0, 0, 0, 0, 0])

# Now we place ordinal values at the indices provided by the arg sorting
result[sorting] = np.arange(A.size)  # array([1, 7, 4, 2, 3, 0, 5, 6])

# Finally, we shape it back as the original
result = result.reshape(A.shape)  # array([[[1, 7], [4, 2]], [[3, 0], [5, 6]]])

在 Scott Hunter 對重復項發表評論后編輯:以上將始終提供排序,這意味着重復項不會返回相同的索引。 在重復的情況下,原始數組的順序用於解綁。 例如:

B = np.array([[[4, 11], [7, 5]], [[7, 1], [11, 9]]])
sorting = B.flatten().argsort()  # array([5, 0, 3, 2, 4, 7, 1, 6])
result = np.zeros(B.size, dtype=int)  # array([0, 0, 0, 0, 0, 0, 0, 0])
result[sorting] = np.arange(B.size)  # array([1, 6, 3, 2, 4, 0, 7, 5])
result = result.reshape(B.shape)  # array([[[1, 6], [3, 2]], [[4, 0], [7, 5]]])

如果您希望擁有具有相同索引的重復值,則類似於排序的方法比排序更可取(這實際上更容易)。

B = np.array([[[4, 11], [7, 5]], [[7, 1], [11, 9]]])

# Get the ranks
_, ranks = np.unique(B, return_inverse=True)

# Reshape to get the result
result = ranks.reshape(B.shape)  # array([[[1, 5], [3, 2]], [[3, 0], [5, 4]]])

注意 1:第二種方法給出的結果與數組A的第一種方法相同。

注意2:正確地說,這些並不是真正的“排名”,而是最終由重復值共享的順序索引。 一個適當的基於排名的解決方案會給出類似array([[[1, 6], [3, 2]], [[3, 0], [6, 5]]])的東西。 不幸的是,據我所知,numpy 不提供實際的直接排名,您需要實現它。 所以,在沒有更多信息的情況下,為了簡單起見,我將把它保持在這種“骯臟”的狀態。

暫無
暫無

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

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