我有一个包含超过100,000个值的列表.
我需要根据特定的bin宽度(例如0.1)将列表分成多个较小的列表.任何人都可以帮我如何写一个python程序来做到这一点?
我的清单看起来像这样
-0.234
-0.04325
-0.43134
-0.315
-0.6322
-0.245
-0.5325
-0.6341
-0.5214
-0.531
-0.124
-0.0252
Run Code Online (Sandbox Code Playgroud)
我希望有这样的输出
list1 = [-0.04325, -0.0252]
list2 = [-0.124]
list3 = [-0.234, -0.245 ]
list4 = [-0.315]
list5 = [-0.43134]
list6 = [-0.5325, -0.5214, -0.531]
list7 = [-0.6322, -0.6341]
Run Code Online (Sandbox Code Playgroud)
这是一个使用numpys数字化的简单而好的方法:
>>> import numpy as np
>>> mylist = np.array([-0.234, -0.04325, -0.43134, -0.315, -0.6322, -0.245,
-0.5325, -0.6341, -0.5214, -0.531, -0.124, -0.0252])
>>> bins = np.arange(0,-1,-0.1)
>>> for i in xrange(1,10):
... mylist[np.digitize(mylist,bins)==i]
...
array([-0.04325, -0.0252 ])
array([-0.124])
array([-0.234, -0.245])
array([-0.315])
array([-0.43134])
array([-0.5325, -0.5214, -0.531 ])
array([-0.6322, -0.6341])
array([], dtype=float64)
array([], dtype=float64)
Run Code Online (Sandbox Code Playgroud)
digitize,返回一个数组,其中包含每个元素所属的bin的索引值.
这将创建一个dict,其中每个值都是适合bin的元素列表.
import collections
bins = collections.defaultdict(list)
binId = lambda x: int(x*10)
for val in vals:
bins[binId(val)].append(val)
Run Code Online (Sandbox Code Playgroud)