我正在嘗試獲取一個包含 6n 1 或 6n-1 形式的所有數字的串列。目前我有這個:
n = 100000000
l = int(n/6)
f1 = lambda x: (6*x)-1
f3 = lambda x: (6*x) 1
primeCandidate = [f(i) for i in range(1,l 1) for f in (f1,f3)]
這很好用,它在每個 i 的串列中獲得 2 個值,但我想知道我是否可以用 NumPy 陣列做類似的事情
uj5u.com熱心網友回復:
這個怎么樣。當你將一個數除以 6 時,模數必須是 1 或 5:
arr = np.arange(2, n)
out = arr[np.isin(np.mod(arr, 6), [1,5])]
測驗:
assert arr[np.isin(np.mod(arr, 6), [1,5])].tolist() == [f(i) for i in range(1,l 1) for f in (f1,f3)]
uj5u.com熱心網友回復:
當然。
pc1 = np.arange(0,n,6) 5
pc2 = np.arange(0,n,6) 1
pc = np.concatenate((pc1,pc2))
uj5u.com熱心網友回復:
您可以使用np.dstack兩個np.arange()s 和 a .reshape(-1):
primeCandidates = np.dstack((np.arange(5,n,6), np.arange(7,n,6))).reshape(-1)
測驗:
>>> np.all(np.dstack((np.arange(5,n,6), np.arange(7,n,6))).reshape(-1) == [f(i) for i in range(1,l 1) for f in (f1,f3)])
True
這似乎在性能方面擊敗了 enke 約 10 倍:
%timeit enke()
3.22 s ± 116 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit richardec()
259 ms ± 57.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
感謝Michael Szczesny建議使用reshape(-1)而不是ravel速度,以及清理范圍的開始、停止和步驟!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/448409.html
標籤:Python python-3.x 麻木的
