Поиск наименьших чисел Python numpy список - PullRequest
1 голос
/ 28 мая 2020

У меня есть список Python 3, который содержит произвольное количество numpy массивов разного размера / формы. Проблема состоит в том, чтобы удалить наименьшее p% (где, например, p = 20%) числа (по величине) в списке до нуля.

Пример кода:

l = []

l.append(np.random.normal(1.5, 1, size = (4, 3)))
l.append(np.random.normal(1, 1, size = (4, 4)))
l.append(np.random.normal(1.8, 2, size = (2, 4)))


for x in l:
    print(x.shape)

'''                                            
(4, 3)
(4, 4)
(2, 4)
'''

Как я могу удалить наименьший p% чисел из списка 'l' Python "глобально", это означает, что для всех numpy массивов, содержащихся в списке 'l', он удалит наименьший p% числа наименьшие числа (по величине) до нуля?

Я использую Python 3,8 и numpy 1,18.

Спасибо!

Пример игрушки:

l
'''
[array([[ 0.95400011,  1.95433152,  0.40316605],
        [ 1.34477354,  3.24612127,  1.54138912],
        [ 1.158594  ,  0.77954464,  0.4600395 ],
        [-0.03092974,  3.55349303,  0.85526191]]),
 array([[ 2.33613547,  0.12361808,  0.27620035,  0.70452795],
        [ 0.76989846, -0.28613191,  1.90050011,  2.73843595],
        [ 0.13510186,  0.91035556,  1.42402321,  0.60582303],
        [-0.13655066,  2.4881577 ,  2.0882935 ,  1.40347429]]),
 array([[-1.63365952,  1.2616223 ,  0.86784273, -0.34538727],
        [ 1.37161267,  2.4570491 , -0.72419948,  1.91873343]])]
'''

'l' состоит из 36 цифр. Теперь 20% от 36 = 7,2 или округление в меньшую сторону = 7. Идея состоит в том, что 7 наименьших величин из 36 чисел удаляются путем маскирования их до нуля!

Ответы [ 2 ]

1 голос
/ 28 мая 2020

вы можете попробовать следующее. Он ищет пороговое значение и обновляет список на месте до 0, когда значение ниже порога.

Сообщите мне, если вам нужны дополнительные сведения

import numpy as np

l = []

l.append(np.random.normal(1.5, 1, size = (4, 3)))
l.append(np.random.normal(1, 1, size = (4, 4)))
l.append(np.random.normal(1.8, 2, size = (2, 4)))

acc = []
p = 20 #percentile to update to 0

for x in l:
    acc.append(x.flatten())

threshold = np.percentile(np.concatenate(acc),p)

for x in l:
  x[x < threshold] = 0 
0 голосов
/ 28 мая 2020

Вы можете использовать это:

p = 20 #percentile to remove
lower = np.percentile(np.hstack([x.flatten() for x in l]), p)
for x in l:
  x[x<lower] = 0

Вы в основном складываете все числа в один массив и, используя np.percentile, находите порог для нижней границы p%, а затем фильтруете массивы, используя нижний порог.

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