如何向量化此矩阵运算?

时间:2019-12-13 14:57:25

标签: python numpy vectorization

(我之前问过类似的问题,但这是一个不同的操作。)

我有2个布尔掩码数组,我想对两个掩码的每个组合计算一个运算。

慢速版本

N = 10000
M = 580
masksA = np.array(np.random.randint(0,2, size=(N,M)), dtype=np.bool)
masksB = np.array(np.random.randint(0,2, size=(N,M)), dtype=np.bool)

result = np.zeros(shape=(N,N), dtype=np.float)
for i in range(N):
    for j in range(N):
        result[i,j] = np.float64(np.count_nonzero(np.logical_and(masksA[i,:],masksB[j,:]))) / M

1 个答案:

答案 0 :(得分:3)

问题文本显示为masksA时,第一个输入似乎是"operation on every combination of two masks"

我们可以使用matrix-multiplication来解决它,就像这样-

result = masksA.astype(np.float).dot(masksB.T)/M

或者,将较低精度的np.float32用于dtype转换,以加快计算速度。既然,我们在计算,它应该以较低的精度很好。

时间-

In [5]: N = 10000
   ...: M = 580
   ...: 
   ...: np.random.seed(0)
   ...: masksA = np.array(np.random.randint(0,2, size=(N,M)), dtype=np.bool)
   ...: masksB = np.array(np.random.randint(0,2, size=(N,M)), dtype=np.bool)

In [6]: %timeit masksA.astype(np.float).dot(masksB.T)
1.87 s ± 50.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [7]: %timeit masksA.astype(np.float32).dot(masksB.T)
1 s ± 7.93 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)