"
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.
3 réponses
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?
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)
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>)