我必须使用大量的 python 列表:我有两个包含近 50.000 个元素的列表,我必须将第二个列表中的每个元素减去第一个元素,然后生成一个直方图。事实是我当然没有足够的内存来存储 50.000x50.000 个元素,所以我必须找到另一种方法。我所做的(并且适用于较短的列表)只是做每个差异并将它们存储在一个列表中,然后我用 matplotlib 直方图函数绘制,但我认为我需要像实时直方图一样生成,所以我不必存储每个差异。我试图以这种方式制作直方图: for i in range (0,x): if ((i*H)<r<(H+i*H)): d[i]=d[i]+1其中 x 是 bin 的数量,H 是 bin 的大小,但速度非常慢并且实际上不可用。你能帮我想想其他的想法吗?有一种方法可以绘制一种“实时直方图”吗?谢谢!
1 回答
GCT1015
TA贡献1827条经验 获得超4个赞
使用计数器(来自集合),您可以动态获取差异计数,而无需存储所有差异。
import random
list1 = [random.randrange(1,1000) for _ in range(50000)]
list2 = [random.randrange(1,1000) for _ in range(50000)]
from collections import Counter
counts = Counter(list2)
for diff in [1,2,3,4]: # the differences to display
count = sum(counts[v-diff] for v in list1)
print(diff,":",count)
1 : 2496311
2 : 2496457
3 : 2494224
4 : 2487048
它的作用是将第二个列表的不同值的计数存储在 Counter 字典中。这使您可以快速获取任何给定差值的元素对数。由于您的直方图不会一次显示 2.5G 差异,因此仅计算实际需要的差异计数可以大大减少计算量。
请注意,我假设您的元素是整数值。这使得差异的值在一个范围内是可预测的。如果您的值是浮点数,您将需要使用差异范围(这将使问题回到更简单的整数过程)。
添加回答
举报
0/150
提交
取消