寻找最小的数字Python numpy列表

时间:2020-05-27 23:46:17

标签: python-3.x numpy

我有一个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)
'''

如何从“ l” Python列表“全局”删除最小的p%的数字,这意味着对于列表“ l”中包含的所有numpy数组,它将删除最小的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个数字。现在36中的20%= 7.2或四舍五入=7。因此,想法是将36个数字中的7个最小量级数字屏蔽为零,从而将它们删除!

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法。它会查找阈值,并在阈值以下时将列表更新为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 

答案 1 :(得分:-1)

您可以使用此:

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%下限的阈值,然后使用下阈值过滤数组。

相关问题