我有一個示例陣列
import numpy as np
a = np.array(
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
[13, 14, 15],
]
)
以及我想從中獲取平均值的索引陣列
b = np.array([[1,3], [1,2], [2,3]])
此外,我需要最終結果將第一行連接到這些平均值中的每一個
我可以使用這個得到想要的結果
np.concatenate( (np.tile(a[0],(3,1)), a[b].mean(1)), axis=1)
array([[ 1. , 2. , 3. , 7. , 8. , 9. ],
[ 1. , 2. , 3. , 5.5, 6.5, 7.5],
[ 1. , 2. , 3. , 8.5, 9.5, 10.5]])
我想知道是否有一種計算效率更高的方法,因為我聽說連接很慢
Numpy 連接很慢:任何替代方法?
我在想可能有一種方法可以結合高級索引、.mean()和 reshape,但是我無法想出任何可以提供所需陣列的方法。
uj5u.com熱心網友回復:
問題不在于concatenate速度慢。事實上,它并沒有那么慢。問題是在回圈中使用它以生成不斷增長的陣列。這種模式效率很低,因為它會產生許多臨時陣列和副本。但是,在您的情況下,您不使用這樣的模式,所以這很好。在這里,concatenate正確使用并完全符合您的意圖。您可以創建一個陣列并分別填充左右部分,但這是最后concatenate應該做的。話雖如此,由于許多內部檢查**(以便調整其關于輸入陣列形狀的行為),因此concatenate主要針對小型陣列(如大多數 Numpy 函式)具有相當大的開銷。此外,隱式轉換from np.int_to np.float64ofnp.tile(a[0],(3,1))引入了另一個開銷。此外,請注意對于這種mean情況不是很優化。(a[b[:,0]] a[b[:,1]]) * 0.5盡管意圖不太清楚,但使用起來更快。
n, m = a.shape[1], b.shape[0]
res = np.empty((n, m*2), dtype=np.float64)
res[:,m] = a[0] # Note: implicit conversion done here
res[:,m:] = (a[b[:,0]] a[b[:,1]]) * 0.5 # Also here
使用您的示例,在我的機器上生成的操作大約快 3 倍。大型輸入陣列可能并非如此(盡管我也希望加快速度)。
對于大陣列,最好的解決方案是使用帶有回圈的Numba(或 Cython)代碼,以避免創建/填充大而昂貴的臨時陣列。Numba 還應該加快小型陣列的計算,因為它主要消除了 Numpy 函式的開銷(我預計這里的速度大約提高 5x-10x)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429853.html
下一篇:有沒有辦法讓我的腳本更有效率?
