與許多其他 numpy/random 函式不同,numpy.random.Generator.permutation()它沒有提供在單個函式呼叫中回傳多個結果的明顯方法。給定一個 (1d) numpy 陣列x,我想對(每個長度為 len(x))的n排列進行采樣x,并將結果作為具有 shape 的 numpy 陣列(n, len(x))。生成許多??排列的一種簡單方法是np.array([rng.permutation(x) for _ in range(n)]). 這并不理想,主要是因為回圈在 Python 中,而不是在已編譯的 numpy 函式中。
import numpy as np
rng = np.random.default_rng(1234)
# x is big enough to not want to enumerate all permutations
x = rng.standard_normal(size=20)
n = 10000
perms = np.array([rng.permutation(x) for _ in range(n)])
我的用例是進行蠻力搜索以找到最小化特定屬性的排列(構成“足夠好”的搜索解決方案)。我可以使用 numpy 操作計算每個排列的感興趣的屬性,這些操作可以很好地矢量化/廣播在結果排列矩陣上。事實證明,天真地生成排列矩陣是我代碼中的瓶頸。有沒有更好的辦法?
uj5u.com熱心網友回復:
您可以使用rng.permuted代替rng.permutation并將其與np.tileso 組合以重復x多次并獨立打亂每個重復。方法如下:
perms = rng.permuted(np.tile(x, n).reshape(n,x.size), axis=1)
這在我的機器上比您的初始代碼快 10 倍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/410074.html
標籤:
上一篇:MySQLSQL性能需要一些改進
