"

thoughtx=frame[:,:thought1.shape[1]]


thiss=thoughtx.flatten()
index=heapq.nlargest(round(0.005*256*144*3),thiss )
thoughtx.shape=(1,256,144,3)

`je cherche un moyen efficace de sélectionner tous les éléments d'un tableau 4D dans la valeur supérieure de 0,005% et de les remplacer par ceux tout en convertissant simultanément le reste des entrées en zéro?

J'ai essayé d'utiliser nlargest ci-dessus mais il semble renvoyer une liste. j'espérais qu'il retournerait une copie électronique du tableau d'origine, puis je le modifierais par proxy.

0
Tofara Moyo 3 nov. 2019 à 19:13

3 réponses

Meilleure réponse
def top_n_percent(array, n):
    threshold = (1 - n) *  max(np.ndarray.flatten(np.array(array)))
    return np.where(array > threshold, 1, 0)

Par exemple.

top_n_percent([1, 0.99996, 0.99994, 0.5], 0.00005)
## array([1, 1, 0, 0])


Votre formulation

dans le top 0,005% en valeur

Est tout sauf clair. Cela signifie-t-il que la valeur maximale est mise à 1 et que toutes les valeurs du tableau supérieures à 0,995% de cette valeur doivent être mises à 1 quel que soit leur nombre? (il se pourrait que toutes les valeurs soient supérieures à Ou cela signifie-t-il que sur tous les n éléments, seuls ceux appartenant au 0,99995 supérieur devraient être exprimés comme 1 et toutes les autres comme 0?

0
Gwang-Jin Kim 3 nov. 2019 à 17:07

Vous n'avez pas besoin d'aplatir votre tableau. max () et np.where () devraient faire la tâche

trashold  = thoughtx.max() * (1 - 5e-5)
np.where(a>where, 1, 0)
0
splash58 3 nov. 2019 à 16:34

Vous pouvez simplement comparer au quantile de 99,5% (en supposant que vous voulez dire 0,5% supérieur):

(thoughtx>np.quantile(thoughtx,0.995)).astype(<your_preferred_dtype>)
0
Paul Panzer 3 nov. 2019 à 16:38