寻找更高效的多维绑定方式

Find multi-dimensional binding more efficient way

我正在尝试寻找多维绑定。这是我到目前为止的代码。有什么方法可以更有效率吗?

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)

一种解决方案是对 x 的列应用线性变换,将它们映射到 [0, q-1]。然后只需 运行 a 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) 

(至少与未编译的代码相比,这提供了加速并且 运行s 你的示例在 113 毫秒内)