我需要生成一個隨機二進制矩陣,其維度為 mxn,其中所有行彼此不同。使用 numpy 我試過了
import numpy as np
import random
n = 512
m = 1000
a = random.sample(range(0, 2**n), m)
a = np.array(a)
a = np.reshape(a, (m, 1))
np.unpackbits(a.view(np.uint8), axis=1)
但它不適合我的情況,因為 n > 128 和 m > 1000。所以,上面的代碼只生成最多包含 62 個元素的行。請問你能幫幫我嗎?
uj5u.com熱心網友回復:
您可以生成一個由 0 和 1 組成的隨機陣列,numpy.random.choice然后通過以下方式確保行不同numpy.unique:
import numpy as np
m = 1000
n = 512
while True:
a = np.random.choice([0, 1], size=(m, n))
if len(np.unique(a, axis=0)) == m:
break
uj5u.com熱心網友回復:
我會嘗試一次創建一行,并通過set成員測驗運行時為 O(1) 檢查該行是否已經存在。如果該行存在,只需生成另一個 1,否則將其添加到陣列中并移動到下一行,直到完成。這個原則可以通過以下方式更快:
- 將唯一性設定
counter為 0 - 生成
m - counter行,將唯一行添加到解決方案 - 通過添加的唯一行增加計數器
- 如果
counter == m完成,則回傳 2
實作如下:
import numpy as np
n = 128
m = 1000
a = np.zeros((m,n))
rows = set()
counter = 0
while counter < m:
temp = np.random.randint(0, 2, (m-counter, n))
for row in temp:
if tuple(row) not in rows:
rows.add(tuple(row))
a[counter] = row
counter = 1
運行時比較
通過一次生成所有矩陣并檢查所有行是否唯一,您可以節省大量時間,前提是 n >> log2(m)。
示例 1 具有以下內容:
n = 128
m = 1000
我運行了我的建議和另一個答案中提到的解決方案,結果是:
# my suggestion
17.7 ms ± 328 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# generating all matrix at once and chacking if all rows are unique
4.62 ms ± 198 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
這是因為在這種情況下生成m不同行的可能性非常高。
示例 2 當更改為:
n = 10
m = 1024
我運行了我的建議和另一個答案中提到的解決方案,結果是:
# my suggestion
26.3 ms ± 1.36 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
一次生成所有矩陣并檢查所有行是否唯一的建議沒有完成運行。這是因為當math.log2(m) == n存在完全m有效的行時。隨著矩陣形狀的增加,生成有效矩陣的概率隨機接近 0。
uj5u.com熱心網友回復:
您可以創建一個具有唯一行的矩陣并打亂行:
n = 512
m = 1000
d = np.arange(m) # m unique numbers
d = ((d[:, None] & (1 << d[:n])) > 0).astype(np.uint8) # convert to binary array
i = np.random.randn(m).argsort() # indices used for shuffling rows
a = d[i] # output
所有行都是唯一的:
assert len(np.unique(a, axis=0)) == m
計時
n=128, m=1000:
271 μs ± 6.06 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
n=2**10, m=2**14:
50.9 ms ± 2.33 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
這對 最有效n <= m,否則您需要與 交換d[:n],np.arange(n)從而導致運行時間更長。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448662.html
