(我之前问过类似的问题,但这是一个不同的操作。)
我有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
答案 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)