La questione afferma che la matrice di ingresso è di forma (128, 36, 8)
e siamo interessati a trovare sottoarray unici di lunghezza 8
in ultima dimensione. Quindi, presumo che l'unicità sia unita alle prime due dimensioni. Supponiamo che A
sia l'array 3D di input.
ottenere il numero di sottoarray unici
# Reshape the 3D array to a 2D array merging the first two dimensions
Ar = A.reshape(-1,A.shape[2])
# Perform lex sort and get the sorted indices and xy pairs
sorted_idx = np.lexsort(Ar.T)
sorted_Ar = Ar[sorted_idx,:]
# Get the count of rows that have at least one TRUE value
# indicating presence of unique subarray there
unq_out = np.any(np.diff(sorted_Ar,axis=0),1).sum()+1
Campione Run -
In [159]: A # A is (2,2,3)
Out[159]:
array([[[0, 0, 0],
[0, 0, 2]],
[[0, 0, 2],
[2, 0, 1]]])
In [160]: unq_out
Out[160]: 3
ottenere il conteggio di occorrenze di sottoarray unici Run
# Reshape the 3D array to a 2D array merging the first two dimensions
Ar = A.reshape(-1,A.shape[2])
# Perform lex sort and get the sorted indices and xy pairs
sorted_idx = np.lexsort(Ar.T)
sorted_Ar = Ar[sorted_idx,:]
# Get IDs for each element based on their uniqueness
id = np.append([0],np.any(np.diff(sorted_Ar,axis=0),1).cumsum())
# Get counts for each ID as the final output
unq_count = np.bincount(id)
Esempio -
In [64]: A
Out[64]:
array([[[0, 0, 2],
[1, 1, 1]],
[[1, 1, 1],
[1, 2, 0]]])
In [65]: unq_count
Out[65]: array([1, 2, 1], dtype=int64)
Non riuscivo a trovare un modo per farlo in modo disordinato, ma un [trie] (https://en.wikipedia.org/wiki/Trie) sarebbe troppo lento? Avrebbe solo bisogno di accedere a ciascun elemento una sola volta e alla fine si avrà automaticamente il numero di sottoarray unici e le loro posizioni se li hai memorizzati. – KobeJohn
Ecco una domanda strettamente correlata, http://stackoverflow.com/questions/8560440/removing-duplicate-columns-and-rows-from-a-numpy-2d-array. L'idea di base è di ordinare i sottotitoli (ordinamento lessicografico). Una volta raggruppati i sottoarray simili, è banale identificarli e contarli. –