【发布时间】:2019-01-21 16:57:52
【问题描述】:
我的问题如下。我有两个数组 X 和 Y,形状为 n,p 其中 p >> n(例如 n = 50,p = 10000)。
相对于p,我还有一个掩码mask(大小为p 的布尔值的一维数组),密度为small(例如np.mean(mask) 为0.05)。
我尝试尽可能快地计算X 和Y 相对于mask 的内积:输出inner 是一个形状为n, n 的数组,并且是这样的@ 987654332@.
我曾尝试使用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) 比 X.dot(Y.T) 慢大约 5 倍...
首先,我认为.dot 不知道掩码仅针对p 是一个问题,但我不知道是否可以使用此信息。
我正在寻找一种方法来执行计算而不会比天真的点慢很多。
非常感谢!
【问题讨论】:
-
对于常规数值数组
np.dot使用快速编译的 BLAS(或类似)库。我不知道它对掩码数组的作用的细节,至少它必须做一个额外的dot来处理掩码。我知道在objectdtype 数组的情况下,它会使用对象的 * 和 + 方法。 -
scipy.sparse可能是这里的方式 - 你可以将你的 X 和 Y 转换为稀疏矩阵,然后从那里开始 -
在演示中,您只屏蔽了 5% 的术语。