找到多维绑定更有效的方法

时间:2018-02-12 01:32:34

标签: python algorithm binning

我试图找到多维绑定。这是我到目前为止的代码。有没有办法让它更有效率?

a = np.random.random((3000,3000)) 

def flinspace(a, b, n, endpoint=True):
    a, b = np.asanyarray(a), np.asanyarray(b)
return a[..., None] + (b-a)[..., None]/(n-endpoint) * np.arange(n)

@jit
def fdigitize(x,q,axis=0):
    x = np.asanyarray(x).copy()
    f,l = np.nanmin(x,axis=axis),np.nanmax(x,axis=axis)
    y = flinspace(f,l,q)
    for i in range(x.shape[1]):
        mask = ~np.isnan(x[:,i]);x[:,i][mask] = np.digitize(x[:,i][mask], y[i])-1
    return x 

%timeit xx = fdigitize(a,100)

1 个答案:

答案 0 :(得分:1)

一种解决方案是将线性变换应用于x列,将它们映射到[0, q-1]。然后只需运行np.floor即可获得自己的垃圾箱。 (对于最大值,这给出了与算法略有不同的解决方案,其中您的算法与每列的最大元素应属于bin q-1q-2 <)不一致。

def fdigitizeadj(x, q, axis=0):
    x = np.asanyarray(x)
    f = np.nanmin(x, axis=axis)
    l = np.nanmax(x, axis=axis)
    adj = (q-1)*(x-f)/(l-f)  # Linear transformation here
    return np.floor(adj) 

(至少与未经编码的代码相比,这会给出加速并在113ms内运行您的示例)