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

2024-09-28 16:58:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到多维绑定。这是我目前掌握的密码。有什么方法能更有效地做到这一点吗?你知道吗

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)

Tags: 方法nonetrue密码returndefnpmask
1条回答
网友
1楼 · 发布于 2024-09-28 16:58:21

一种解决方案是对x的列应用线性变换,将它们映射到[0, q-1]。然后简单地运行np.floor来获取他们的垃圾箱。 (这与最大值的算法给出的解决方案略有不同,在最大值的算法中,每列的max元素应该属于binq-1还是q-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) 

(至少与非jitted代码相比,这提供了一个加速,并在113ms内运行您的示例)

相关问题 更多 >