我的问题如下。我有两个数组X
and Y
形状为 n, p 其中p>>n(例如 n = 50,p = 10000)。
我也有口罩mask
(大小为布尔值的一维数组p
) 关于p
, of small密度(例如np.mean(mask)
为 0.05)。
我尝试尽可能快地计算内积X
and Y
关于mask
: 输出inner
是一个形状数组n, n
,并且是这样的inner[i, j] = np.sum(X[i, np.logical_not(mask)] * Y[j, np.logical_not(mask)])
.
我尝试过使用numpy.ma
库,但对我来说它的使用速度相当慢:
import numpy as np
import numpy.ma as ma
n, p = 50, 10000
density = 0.05
mask = np.array(np.random.binomial(1, density, size=p), dtype=np.bool_)
mask_big = np.ones(n)[:, None] * mask[None, :]
X = np.random.randn(n, p)
Y = np.random.randn(n, p)
X_ma = ma.array(X, mask=mask_big)
Y_ma = ma.array(Y, mask=mask_big)
但后来,在我的机器上,X_ma.dot(Y_ma.T)
大约慢5倍X.dot(Y.T)
...
首先,我认为这是一个问题.dot
殊不知面具只是相对而言p
但我不知道是否可以使用这些信息。
我正在寻找一种执行计算的方法,而又不会比天真的点慢很多。
多谢 !