寻找更高效的多维绑定方式
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-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)
(至少与未编译的代码相比,这提供了加速并且 运行s 你的示例在 113 毫秒内)
我正在尝试寻找多维绑定。这是我到目前为止的代码。有什么方法可以更有效率吗?
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-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)
(至少与未编译的代码相比,这提供了加速并且 运行s 你的示例在 113 毫秒内)