numpy.histogram(data,bin)是一种非常快速有效的方法,用于计算数据数组中有多少元素落入数组箱定义的bin中。是否有相同的功能来解决以下问题?我有一个R行乘以C列的矩阵。我想使用bin给出的定义来对矩阵的每一行进行bin。结果应该是带有R行的另一个矩阵,并且列数等于bin的数量。
我尝试使用函数numpy.histogram(data,bin)作为输入矩阵,但我发现矩阵被视为带有R * C元素的数组。然后,结果是一个带有Nbins元素的数组。
答案 0 :(得分:2)
如果您将此应用于具有多行的数组,则此功能将以某些临时内存为代价提高速度。
def hist_per_row(data, bins):
data = np.asarray(data)
assert np.all(bins[:-1] <= bins[1:])
r, c = data.shape
idx = bins.searchsorted(data)
step = len(bins) + 1
last = step * r
idx += np.arange(0, last, step).reshape((r, 1))
res = np.bincount(idx.ravel(), minlength=last)
res = res.reshape((r, step))
return res[:, 1:-1]
最后一行的res[:, 1:-1]
与numpy.histogram一致,它返回一个len len(bins) - 1
的数组,但如果要计算小于等于的值,可以删除它分别比bins[0]
和bins[-1]
。
答案 1 :(得分:1)
感谢大家的回答和评论。最后,我找到了加快分箱程序的方法。我没有使用np.searchsorted(data)
而是np.array(data*nbins, dtype=int)
。在Bi Rico发布的代码中替换此行,我发现它变得快3倍。在下面我通过我的修改发布了Bi Rico的功能,以便其他用户可以轻松地接受它。
def hist_per_row(data, bins):
data = np.asarray(data)
assert np.all(bins[:-1] <= bins[1:])
r, c = data.shape
nbins = len(bins)-1
data = data/bins[-1]
idx = array(data*nbins, dtype=int)+1
step = len(bins) + 1
last = step * r
idx += np.arange(0, last, step).reshape((r, 1))
res = np.bincount(idx.ravel(), minlength=last)
res = res.reshape((r, step))
return res[:, 1:-1]
答案 2 :(得分:0)
这些方面的东西?
import numpy as np
data = np.random.rand(10,20)
print np.apply_along_axis(lambda x: np.histogram(x)[0], 1, data)