我已经设置了我的垃圾箱的参数,我想找到当数据点落在特定垃圾箱的范围内时如何向垃圾箱添加一个,基本上计算每个垃圾箱范围内有多少数据点,以便我可以将其用作"频率"当我把它绘制出来时。
我的箱子范围由:
设定 bins = [(i*bin_width, (i+1)*bin_width) for i in range(num_bins)]
我的数据类似于:
2.55619101399
2.55619101399
2.55619101399
3.615
4.42745271008
2.55619101399
2.55619101399
2.55619101399
4.42745271008
3.615
2.55619101399
4.42745271008
5.71581687075
5.71581687075
3.615
2.55619101399
2.55619101399
2.55619101399
2.55619101399
2.55619101399
答案 0 :(得分:3)
由于你正在使用NumPy,你(a)不应该尝试创建列表并循环它们而不是使用数组,并且(b)应该看看你想要做的是否已经内置(或者在SciPy或Pandas或其他基于NumPy的库中提供),因为它经常出现。
而numpy.histogram
正是你想要的。
它需要一个总宽度而不是一个bin宽度,但除此之外,插入你已经拥有的值并获得你想要的值是微不足道的:
hist, edges = np.historgram(
data_points,
bins=num_bins,
range=(0, bin_width*num_bins),
density=False)
hist
数组将包含每个bin的计数(如我的其他答案中的bin_counts
),这是您要进行后处理并最终生成图表的内容。
edges
,您可能需要也可能不需要。它与原始问题中的bins
信息相同,但格式不同 - 而不是[(0, .1), (.1, .2), (.2, .3)]
[0, .1, .2, .3]
。
答案 1 :(得分:1)
嗯,首先,你的每个bins
只是该bin的起始值和结束值的元组,因此无法向其中添加任何内容。您可以将每个bin
更改为[start, stop, 0]
的列表,而不是(start, stop)
的元组,或者甚至更好的更改为对象。或者,您也可以保留与bin_counts
列表并行的单独bins
列表,并在需要时保持zip
个列表。
接下来,如果每个bin从i * bin_width
转到(i+1) * bin_width
,那么如何从数据值中获取i
值?这很简单:乘法的反面是除法,所以它只是data_point // bin_width
。
所以:
bin_counts = [0 for bin in bins]
for data_point in data_points:
bin_number = data_point // bin_width
bin_counts[bin_number] += 1
显示其他选项之一,因为我认为您在评论中询问了这一点:
bins = [[i*bin_width, (i+1)*bin_width, 0] for i in range(num_bins)]
for data_point in data_points:
bin_number = data_point // bin_width
bins[bin_number][2] += 1
此处,每个bin都是[start, stop, count]
的列表,而不是列出(start, stop)
个列表和单独的count
值列表。
答案 2 :(得分:0)
from collections import Counter
frequency_data = Counter()
for d in data:
new_bins = bins
median = len(new_bins)/2
while not new_bins[median][0] < d < new_bins[median][1]:
if d < new_bins[median][0]:
new_bins = new_bins[:median]
elif d > new_bins[median][1]:
new_bins = new_bins[median:]
median = len(new_bins)/2
frequency_data[new_bins[median]] += 1