如何装箱矩阵

时间:2014-01-28 00:27:31

标签: python arrays numpy matrix binning

numpy.histogram(data,bin)是一种非常快速有效的方法,用于计算数据数组中有多少元素落入数组箱定义的bin中。是否有相同的功能来解决以下问题?我有一个R行乘以C列的矩阵。我想使用bin给出的定义来对矩阵的每一行进行bin。结果应该是带有R行的另一个矩阵,并且列数等于bin的数量。

我尝试使用函数numpy.histogram(data,bin)作为输入矩阵,但我发现矩阵被视为带有R * C元素的数组。然后,结果是一个带有Nbins元素的数组。

3 个答案:

答案 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)