Простой способ установить элементы в верхней 0,005% массива в 1, а остальные в ноль - PullRequest
0 голосов
/ 03 ноября 2019

`

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


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

` Я ищу эффективный способ выбрать все элементы 4D-массива в верхнем 0,005% -ном значении и заменить их на элементы, одновременно конвертируя остальные записик нулю?

Я пытался использовать Nlargest выше, но, кажется, возвращает список. я надеялся, что он вернет мягкую копию исходного массива, а затем я изменю его по доверенности.

Ответы [ 3 ]

0 голосов
/ 03 ноября 2019

Юо не нужно выравнивать массив. max () и np.where () должны выполнить задачу

trashold  = thoughtx.max() * (1 - 5e-5)
np.where(a>where, 1, 0)
0 голосов
/ 03 ноября 2019

Вы можете просто сравнить с квантилем 99,5% (при условии, что вы имеете в виду верхние 0,5%):

(thoughtx>np.quantile(thoughtx,0.995)).astype(<your_preferred_dtype>)
0 голосов
/ 03 ноября 2019
def top_n_percent(array, n):
    threshold = (1 - n) *  max(np.ndarray.flatten(np.array(array)))
    return np.where(array > threshold, 1, 0)

например,

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


Ваша формулировка

в верхнем 0,005% в значении

- это все, что не ясно. Означает ли это, что максимальное значение равно 1, а любые значения в массиве, превышающие 0,995% от этого значения, должны быть равны 1, независимо от того, сколько их? (может быть, что все значения больше, чем Or. Это означает, что из всех n элементов только те, которые принадлежат к верхнему 0.99995, должны быть выражены как 1, а все остальные как 0?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...