我有2个numpy矩阵A
和B
:
A
矩阵的可能值仅为1或0(ON或OFF)。 B
矩阵有整数(最小值-1)。 我需要在矩阵B(X-axis)
的元素和它们的频率之间绘制直方图,它们在矩阵A
中被列为ON(在相应的位置)。
例如:
IF A[1][1] and A[2][2] are 1,
AND B[1][1] and B[2][2] are 2,
THEN frequency of 2 should be 2 (similarly for each element of matrix B).
基本上对于B
中的每个元素,如果A
中的对应元素为1
,则其频率会增加1。
我正在处理的矩阵很大(3992x3992)。我如何尽可能高效地完成这项工作?
答案 0 :(得分:1)
如果B
中所有小正整数的值,您只需执行:
count = np.bincount(B.ravel())
tally = np.bincount(B.ravel(), weights=A.ravel())
freq = tally / count
但是因为你有负数,所以最好安全地运行它并首先通过B
运行np.unique
:
unq_val, unq_idx = np.unique(B.ravel(), return_inverse=True)
unq_count = np.bincount(unq_idx)
unq_tally = np.bincount(unq_idx, weights=A.ravel())
unq_freq = unq_tally / unq_count
当numpy 1.9在接下来的几个星期内到达街道时,你可以通过加入单曲中的前两行获得额外的表现优势:
unq_val, unq_idx, unq_count = np.unique(B.ravel(), return_inverse=True,
return_counts=True)
之后,您将x
中的unq_val
值和y
中的相应unq_freq
值。在我的系统上,用这个组成的数据:
A = np.random.randint(2, size=(3992, 3992))
B = np.random.randint(50, size=(3992, 3992))
整个过程在0.3秒内完成,而不是通过独特的,并在使用它时超过6秒。