簡體   English   中英

使用2個Numpy矩陣中的數據繪制直方圖

[英]Plotting Histogram using data from 2 numpy matrices

我有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)。 我如何盡可能有效地做到這一點?

如果B中的值都是小的正整數,則可以簡單地執行以下操作:

count = np.bincount(B.ravel())
tally = np.bincount(B.ravel(), weights=A.ravel())
freq = tally / count

但是因為您有負數,所以最好放心使用並先通過np.unique運行B

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秒多一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM