在numpy中沿一个轴分组数据

时间:2016-10-13 10:10:58

标签: python numpy histogram binning

我有一个大的二维数组arr,我想使用numpy在第二轴上进行合并。因为np.histogram会使当前使用for循环的数组变平:

import numpy as np

arr = np.random.randn(100, 100)

nbins = 10
binned = np.empty((arr.shape[0], nbins))

for i in range(arr.shape[0]):
    binned[i,:] = np.histogram(arr[i,:], bins=nbins)[0]

我觉得应该有更直接,更有效的方法在numpy中做到这一点,但我找不到。

3 个答案:

答案 0 :(得分:8)

您可以使用np.apply_along_axis

x = np.array([range(20), range(1, 21), range(2, 22)])

nbins = 2
>>> np.apply_along_axis(lambda a: np.histogram(a, bins=nbins)[0], 1, x)
array([[10, 10],
       [10, 10],
       [10, 10]])

主要优点(如果有的话)是它略短,但我不会期望太多的性能提升。在每行结果的组装中,它可能稍微有效。

答案 1 :(得分:0)

我对Ami解决方案中的lambda感到有些困惑,因此我将其扩展以显示其功能:

def hist_1d(a):
    return np.histogram(a, bins=bins)[0]

counts = np.apply_along_axis(hist_1d, axis=1, arr=x)

答案 2 :(得分:-4)

您必须使用专门针对您的问题的numpy.histogramdd