在numpy中沿一个轴分组数据

oba*_*tos 11 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]
Run Code Online (Sandbox Code Playgroud)

我觉得应该有一个更直接,更有效的方法在numpy内做到这一点,但我没有找到一个.

Ami*_*ory 9

你可以使用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]])
Run Code Online (Sandbox Code Playgroud)

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

  • 只是要指出使用`lambda a:`和`[0]`而不仅仅是'np.apply_along_axis(np.histogram,axis = 1,arr = x,bins = bins)`的原因是因为`np .histogram`返回两个输出,`hist`和`bin_edges`,这里我们只想要`hist`. (2认同)