我有一个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个最小量级数字屏蔽为零,从而将它们删除!
答案 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%下限的阈值,然后使用下阈值过滤数组。