mtr*_*trw 12
正如你所说,推出自己的并不难.您需要自己设置垃圾箱,并在迭代文件时重复使用它们.以下应该是一个不错的起点:
import numpy as np
datamin = -5
datamax = 5
numbins = 20
mybins = np.linspace(datamin, datamax, numbins)
myhist = np.zeros(numbins-1, dtype='int32')
for i in range(100):
d = np.random.randn(1000,1)
htemp, jnk = np.histogram(d, mybins)
myhist += htemp
Run Code Online (Sandbox Code Playgroud)
我猜测性能会对这么大的文件造成问题,并且在每一行调用直方图的开销可能太慢了. @doug建议使用生成器似乎是解决这个问题的好方法.
这是一种直接存储您的值的方法:
import numpy as NP
column_of_values = NP.random.randint(10, 99, 10)
# set the bin values:
bins = NP.array([0.0, 20.0, 50.0, 75.0])
binned_values = NP.digitize(column_of_values, bins)
Run Code Online (Sandbox Code Playgroud)
'binned_values'是一个索引数组,包含column_of_values中每个值所属的bin的索引.
'bincount'会给你(显然)bin计数:
NP.bincount(binned_values)
Run Code Online (Sandbox Code Playgroud)
给定数据集的大小,使用Numpy的'loadtxt'构建生成器可能很有用:
data_array = NP.loadtxt(data_file.txt, delimiter=",")
def fnx() :
for i in range(0, data_array.shape[1]) :
yield dx[:,i]
Run Code Online (Sandbox Code Playgroud)
用 Fenwick 树分箱 (非常大的数据集;需要百分位边界)
我发布了同一问题的第二个答案,因为这种方法非常不同,并且解决了不同的问题。
如果您有一个非常大的数据集(数十亿个样本),并且您不知道您的 bin 边界应该在哪里,该怎么办?例如,也许您想将事物分成四分位数或十分位数。
对于小数据集,答案很简单:将数据加载到数组中,然后排序,然后通过跳转到数组中该百分比的索引读取任何给定百分位数的值。
对于容纳数组的内存大小不切实际的大型数据集(更不用说排序的时间了)......然后考虑使用 Fenwick 树,又名“二进制索引树”。
我认为这些仅适用于正整数数据,因此您至少需要对数据集有足够的了解才能在 Fenwick 树中制表之前移动(并可能缩放)数据。
我已经使用它在合理的时间和非常舒适的内存限制内找到了 1000 亿个样本数据集的中位数。(根据我的其他答案,考虑使用生成器打开和读取文件;这仍然很有用。)
有关 Fenwick 树的更多信息:
| 归档时间: |
|
| 查看次数: |
11541 次 |
| 最近记录: |