沿着numpy中一个轴的数据分箱

368yc8dk  于 2022-12-18  发布在  其他
关注(0)|答案(4)|浏览(114)

我有一个很大的二维数组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,但我没有找到一个。

mf98qq94

mf98qq941#

您可以使用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]])

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

gj3fmq9x

gj3fmq9x2#

我对Ami的解决方案中的lambda有点困惑,所以我扩展了它来展示它的作用:

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

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

e7arh2l63#

要沿着任意轴对numpy数组进行装箱,可以用途:

def bin_nd_data(arr, bin_n = 2, axis = -1):
    """ bin a nD array along one specific axis, to check.."""
    ss = list( arr.shape )
    if ss[axis]%bin_n==0:
        ss[ axis ] = int( ss[axis]/bin_n)
        print('ss is ', ss )
        if axis==-1:
            ss.append( bin_n)
            return np.mean( np.reshape(arr, ss, order='F' ), axis=-1 )
        else:
            ss.insert( axis+1, bin_n )
            return np.mean( np.reshape(arr, ss, order='F' ), axis=axis+1 )
        
    else:
        print('bin nd data, not divisible bin given : array shape :', arr.shape, ' bin ', bin_n)
        return None

考虑"axis= -1“的情况有点麻烦。

twh00eeo

twh00eeo4#

你必须使用numpy.histogramdd专门为你的问题

相关问题