[英]How to apply operations with conditionals, like if, to a large numpy array efficiently in python?
大家下午好,我將原始數據放入numpy數組中,然后我想對數以10為底的對數數組進行運算,但是這些numpy數組太大,因此它們要花很多時間完成它們。
x = [ 20*math.log10(i) if i>0 and 20*math.log10(i)>=-60 else (-(120+20*math.log10(abs(i))) if i<0 and 20*math.log10(abs(i))>=-60 else -60) for i in a3 ]
在之前的代碼中,我使用了從原始音頻數據中拋出的一個channels數組“ a3”,並制作了另一個數組“ x”,其中包含一個數組,用於繪制從-120到0的值。 y邊。 Futhermore,因為您可能注意到,我需要分開numpy的陣列比numpy的陣列負原創要素,同時還積極0原創要素,是-60之后的操作0。有了這個最后的情節: 在這里輸入圖像描述
這段代碼的問題在於,正如我之前所說,完成計算大約需要10秒鍾,而這僅適用於1個通道,並且我需要計算8個通道,因此我需要等待大約80秒。
我想知道是否有更快的方法來執行此操作,此外,我找到了一種將numpy.log10應用於整個numpy數組的方法,並且它的計算時間不到兩秒:
x = 20*numpy.log10(abs(a3))
但是我沒有發現任何與使用ifs,條件或類似內容操縱該操作的首選項numpy.log10相關的信息。 我確實需要確定負的和正的原始值以及0,然后將0顯然轉換為-60,使-60成為最小限制和參考點,就像我之前向您展示的代碼一樣。
注意:我已經嘗試使用“ for”和“ while”之類的循環來執行此操作,但是它比實際方法花費更多的時間,例如每個14秒。
謝謝您的反饋!!
通常,在發布問題時,最佳做法是包括一個小的工作示例。 我知道您提供了一張數據圖片,但是其他人很難使用,因此最好只提供一小部分數據。 這很重要,因為解決方案通常取決於數據。 例如,您的所有數據(我認為)在-1和1之間,因此對數始終為負。 如果不是這種情況,那么您的解決方案可能無法正常工作。
無需檢查i>0
,然后在i
為負時應用abs
。 這正是應用abs
首先要做的。
如您所見,我們還可以使用numpy向量化來避免列表理解。 通常,對[ np.sin(x) for x in X]
執行類似np.sin(X)
速度要快於[ np.sin(x) for x in X]
。
最后,如果您在numpy中執行X>0
的操作,它將返回一個布爾數組,說明每個元素是否>0
。
請注意,編寫列表理解的另一種方法是,首先使用20*math.log10(abs(i))
並將所有<-60
值替換為-60
,然后在i<0
任何地方替換,將數據翻轉到-60` 。 我們可以在向量化操作中做到這一點。
-120*(a3<0)+np.sign(a3)*np.maximum(20*np.log10(np.abs(a3)),-60)
由於a3<0
和np.sign(a3)
正在做類似的事情,因此可以對此進行一些優化。 就是說,我很確定這比列表理解要快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.