我试图找到多维绑定。这是我到目前为止的代码。有没有办法让它更有效率?
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)
答案 0 :(得分: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)
(至少与未经编码的代码相比,这会给出加速并在113ms内运行您的示例)