這是此 SO 答案的后續行動
https://stackoverflow.com/a/71185257/3259896
此外,請注意,對于這種情況,均值并不是很優化。使用 (a[b[:,0]] a[b[:,1]]) * 0.5 更快,盡管意圖不太清楚。
這在評論中進一步闡述
平均值針對兩種情況進行了優化:計算沿最后一個連續軸的連續線的平均值或計算沿非連續軸的許多長連續線的平均值。
我查找了連續陣列,發現它在這里解釋
連續陣列和非連續陣列有什么區別?
這意味著存盤在完整的記憶體塊中。
但是,我仍然不清楚是否有任何可靠的情況我應該使用mean而不是僅在 python 中執行計算。
我希望有一些可靠的例子來說明何時何地使用每種型別的操作。
uj5u.com熱心網友回復:
雖然我已經作業numpy了很長時間,但我仍然需要計時。我可以預測一些比較,但不是全部。此外,還有一個縮放問題。您之前的示例相對較小。
使用 (5,3) 和 (3,2)a和b:
In [145]: timeit np.add(a[b[:,0]],a[b[:,1]])/2
17.8 μs ± 24.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [146]: timeit (a[b[:,0]] a[b[:,1]])/2
17.9 μs ± 302 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [147]: timeit (a[b[:,0]] a[b[:,1]])/2
17.8 μs ± 18.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [148]: timeit np.add(a[b[:,0]],a[b[:,1]])/2
18 μs ± 6.43 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [149]: timeit np.add.reduce(a[b],1)/2
19.3 μs ± 1.04 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [150]: timeit np.sum(a[b],1)/2
25.1 μs ± 309 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [151]: timeit np.mean(a[b],1)
35.9 μs ± 853 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [152]: timeit a[b].mean(1)
29.4 μs ± 658 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [153]: timeit a[b].sum(1)/2
20.9 μs ± 885 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
雖然a[b[:,0]] a[b[:,1]]最快,但您可能不想擴展 when bis (n, 5)。
請注意,所有這些替代方案都充分利用了numpy陣列方法。
您要注意的是在陣列上使用類似串列的迭代,或者對串列執行陣列操作,尤其是小串列。從串列中創建一個陣列需要時間。迭代陣列元素比迭代串列元素慢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429104.html
下一篇:兩個陣列比較找出不匹配的值
