我有一个包含超过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
我希望有这样的输出
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]
答案 0 :(得分:9)
>>> 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)
digitize,返回一个数组,其中包含每个元素所属的bin的索引值。
答案 1 :(得分:5)
这将创建一个dict,其中每个值都是一个适合bin的元素列表。
import collections
bins = collections.defaultdict(list)
binId = lambda x: int(x*10)
for val in vals:
bins[binId(val)].append(val)
答案 2 :(得分:3)
f = [-0.234, -0.04325, -0.43134, -0.315, -0.6322, -0.245,
-0.5325, -0.6341, -0.5214, -0.531, -0.124, -0.0252]
import numpy as np
data = np.array(f)
hist, edges = np.histogram(data, bins=10)
print hist
的产率:
[2 3 0 1 0 1 2 0 1 2]
这个问题assigning points to bins可能会有所帮助。
答案 3 :(得分:3)
这有效:
l=[-0.234, -0.04325, -0.43134, -0.315, -0.6322, -0.245,
-0.5325, -0.6341, -0.5214, -0.531, -0.124, -0.0252]
d={}
for k,v in zip([int(i*10) for i in l],l):
d.setdefault(k,[]).append(v)
LoL=[d[e] for e in sorted(d.keys(), reverse=True)]
for i,l in enumerate(LoL,1):
print('list',i,l)
打印:
list 1 [-0.04325, -0.0252]
list 2 [-0.124]
list 3 [-0.234, -0.245]
list 4 [-0.315]
list 5 [-0.43134]
list 6 [-0.5325, -0.5214, -0.531]
list 7 [-0.6322, -0.6341]
工作原理:
1: The list
>>> l=[-0.234, -0.04325, -0.43134, -0.315, -0.6322, -0.245,
... -0.5325, -0.6341, -0.5214, -0.531, -0.124, -0.0252]
2: Produce the keys:
>>> [int(i*10) for i in l]
[-2, 0, -4, -3, -6, -2, -5, -6, -5, -5, -1, 0]
3: Produce tuples to put in the dict:
>>> zip([int(i*10) for i in l],l)
[(-2, -0.234), (0, -0.04325), (-4, -0.43134), (-3, -0.315), (-6, -0.6322),
(-2, -0.245), (-5, -0.5325), (-6, -0.6341), (-5, -0.5214), (-5, -0.531),
(-1, -0.124), (0, -0.0252)]
4: unpack the tuples into k,v and loop over the list
>>>for k,v in zip([int(i*10) for i in l],l):
5: add k key to a dict (if not there) and append the float value to a list associated
with that key:
d.setdefault(k,[]).append(v)
我建议对这些语句进行Python教程。
答案 4 :(得分:1)
可以使用itertools.groupby
完成分箱:
import itertools as it
iterable = ['-0.234', '-0.04325', '-0.43134', '-0.315', '-0.6322', '-0.245',
'-0.5325', '-0.6341', '-0.5214', '-0.531', '-0.124', '-0.0252']
a,b,c,d,e,f,g = [list(g) for k, g in it.groupby(sorted(iterable), key=lambda x: x[:4])]
c
# ['-0.234', '-0.245']
注意:这个简单的键函数假定iterable中的值介于-0.0和-10.0之间。对于一般情况,请考虑lambda x: "{:.1f}".format(float(x))
。
有关groupby
工作原理的详细信息,另请参阅此post。
答案 5 :(得分:0)
我们可以使用more_itertools
(第三方库)制作垃圾箱。
<强>鉴于强>
iterable = (
"-0.234 -0.04325 -0.43134 -0.315 -0.6322 -0.245 "
"-0.5325 -0.6341 -0.5214 -0.531 -0.124 -0.0252"
).split()
iterable
# ['-0.234', '-0.04325', '-0.43134', '-0.315', '-0.6322', '-0.245', '-0.5325', '-0.6341', '-0.5214', '-0.531', '-0.124', '-0.0252']
<强>代码强>
import more_itertools as mit
keyfunc = lambda x: float("{:.1f}".format(float(x)))
bins = mit.bucket(iterable, key=keyfunc)
keys = [-0.0,-0.1,-0.2, -0.3,-0.4,-0.5,-0.6]
a,b,c,d,e,f,g = [list(bins[k]) for k in keys]
c
# ['-0.234', '-0.245']
<强>详情
我们可以通过键函数进行分区,我们将其定义为将数字格式化为单精度,即-0.213
到-0.2
。
keyfunc = lambda x: float("{:.1f}".format(float(x)))
bins = mit.bucket(iterable, key=keyfunc)
通过键功能定义的键访问这些箱:
c = list(bins[-0.2])
c
# ['-0.234', '-0.245']
通过迭代键访问所有箱子:
f = lambda x: float("{:.1f}".format(float(x)))
bins = mit.bucket(iterable, key=keyfunc)
keys = [-0.0,-0.1,-0.2, -0.3,-0.4,-0.5,-0.6]
for k in keys:
print("{} --> {}".format(k, list(bins[k])))
输出
-0.0 --> ['-0.04325', '-0.0252']
-0.1 --> ['-0.124']
-0.2 --> ['-0.234', '-0.245']
-0.3 --> ['-0.315']
-0.4 --> ['-0.43134']
-0.5 --> ['-0.5325', '-0.5214', '-0.531']
-0.6 --> ['-0.6322', '-0.6341']
列表理解和解包是另一种选择(参见代码示例)。
有关详细信息,另请参阅more_itertools
docs。