簡體   English   中英

apply_along_axis,每個 1d 切片有 2 個不同的參數

[英]apply_along_axis with 2 arguments varying for each 1d slice

我正在嘗試優化當前使用嵌套 for 循環並調用 scipy 函數的代碼。

基本上,我有一個調用 scipy 的 find_peaks() 方法的第一個函數,然后我想插入這些數據點(峰值)以找到一個描述它們的函數。 例如,我首先找到了峰值。 這基本上是一個維度為 25*30(軸 0)的二維數組,每個數組(軸 1)有 1000 個元素。

arr = np.random.rand(25,30,1000)
arr = arr.reshape((arr.shape[0]*arr.shape[1], arr.shape[2]))
# we have a 25*30 set of 1000 pts each. find peaks for that
peaks = np.apply_along_axis(find_peaks, 1, arr, height=0,)

Find peaks 返回以下形式的內容:

peak_indices = peaks[:,0]
peak_values = peaks[:,1]["peak_heights"]

到現在為止還挺好。 這本質上是我想要插值的點的 (x,y) 坐標。

現在,我想使用 scipy.interpolate.interpolate.interp1d(...) 對這對索引高度值進行插值以獲得一些函數。 Interp1d 的簽名格式為:

interp1d(x, y, kind='linear', axis=-1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)

其中 x 是我的 peak_indices,y 是我的 peak_values。

問題:

我如何向這個函數傳遞 2 個隨每個切片而變化的參數? 例如,換句話說,我第一次使用 apply_along_axis 只使用了一個與切片相關的參數(軸 0 的每個 25*30 元素的 1000 點)。 但是在這里我需要傳遞給函數兩個參數 - peak_indices 和 peak_values。 在我將這些參數作為元組或其他東西傳遞給 apply_along_axis 之后,任何 pythonista 都能想出一種巧妙的方法來解壓縮這些參數嗎? 的種類:

arr=*[peak_indices, peak_values] 

我無法真正編輯 interp1D 函數本身,如果我要調用自己的函數,這將是我的解決方案......

編輯:沿軸使用應用的部分好處是,與嵌套 ifs 相比,我應該獲得性能改進,因為 numpy 應該能夠批量處理這些計算。 理想情況下,任何解決方案都應使用仍然允許這些優化的符號。

您從哪里得知apply_along_axis是一種性能工具? 在這種情況下它實際上工作得更快嗎?

arr = np.random.rand(25,30,1000)
arr = arr.reshape((arr.shape[0]*arr.shape[1], arr.shape[2]))
# we have a 25*30 set of 1000 pts each. find peaks for that
peaks = np.apply_along_axis(find_peaks, 1, arr, height=0,)

相比:

peaks = np.array([find_peaks(x, height=0) for x in arr])

這是對 25*30 一維數組集的簡單迭代。

apply進行測試計算以確定返回形狀和數據類型。 它構造result數組,然后在除 1 之外的所有軸上迭代,並使用該 1d 數組調用函數。 沒有編譯或“批量處理”(無論是什么)。 它只是在函數調用中隱藏了一個循環。

它確實使 3d 數組的 2 個軸上的迭代更漂亮,但不會更快:

您可以在原始arr上使用它,以獲得 (25,30,2) 結果:

peaks = np.apply_along_axis(find_peaks, 2, arr_3d, height=0,)

我猜find_peaks返回一個 2 元素的值元組,然后peaks將是一個對象 dtype 數組。

由於apply_along_axis沒有任何性能優勢,我認為嘗試將它與更復雜的數組一起使用沒有意義。 當你有一個 3d 數組和一個接受 1d 輸入的函數時,它很方便,但除此之外......?

暫無
暫無

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

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