【问题标题】:Find multi-dimensional binding more efficient way寻找多维绑定更高效的方式
【发布时间】:2018-02-12 01:32:34
【问题描述】:

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

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)

【问题讨论】:

标签: python algorithm binning


【解决方案1】:

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

(至少与 un-jitted 代码相比,这可以加快速度并在 113 毫秒内运行您的示例)

【讨论】:

  • 谢谢你的回复,这对我很有用,本来想在循环外解决
猜你喜欢
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多