簡體   English   中英

如何在python中有效地將帶有條件的操作(如if)應用於大型numpy數組?

[英]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<0np.sign(a3)正在做類似的事情,因此可以對此進行一些優化。 就是說,我很確定這比列表理解要快。

暫無
暫無

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

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