1

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

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

4

3 回答 3

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]

于 2014-01-28T02:06:12.657 回答
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]
于 2014-01-28T20:25:57.980 回答
0

这些方面的东西?

import numpy as np
data = np.random.rand(10,20)
print np.apply_along_axis(lambda x: np.histogram(x)[0], 1, data)
于 2014-01-28T00:35:17.740 回答