[英]Plotting Histogram using data from 2 numpy matrices
我有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)。 我如何盡可能有效地做到這一點?
如果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.