使用来自2个numpy矩阵的数据绘制直方图

时间:2014-06-03 13:00:17

标签: python numpy matrix

我有2个numpy矩阵AB

  • 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)。我如何尽可能高效地完成这项工作?

1 个答案:

答案 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秒。