1 回答

TA貢獻1788條經驗 獲得超4個贊
問題
在ValueError你所看到的是,作為hpaulj在評論中指出,由于你的p論點被包裹在列表括號[]。這種額外的封閉list使np.random.choice您可以將您解釋p為形狀的二維數組(1, x)而不是一維數組。由于您的第一個參數 tonp.random.choice是一個整數,因此該函數期望p是一維的,因此當它看到它不是時會拋出錯誤(有關完整詳細信息,請參閱choice文檔)。
您可以ValueError通過刪除周圍的括號來解決這個問題p:
enqueue = np.random.choice(M, in_freq[k], p=mat[k*N:k*N+M-1])
但是,現在您的代碼將引發一個新的和不同的ValueError:
ValueError: a and p must have same size
這ValueError是因為您生成扁平 NxM 矩陣的行切片的mat方式不正確。
解決方案
從您問題中的描述來看,您的意圖似乎是mat通過切片 1D來循環遍歷原始 2D 的行mat。這里是你如何解決切片在你的代碼,這樣你迭代的排mat在你的for循環:
import numpy as np
N = 10
M = 5
in_freq = np.random.randint(0, 10, N)
mat = np.random.rand(N, M)
# normalize so that each row is a probability dist
mat /= mat.sum(axis=1, keepdims=True)
# flatten to match OP's question
mat = mat.flat
for k in range(N):
print((M*k, M*(k + 1)))
enqueue = np.random.choice(M, in_freq[k], p=mat[M*k:M*(k + 1)])
測試
為了證明現在正在生成正確的切片,我添加了一個打印語句,在循環的每次迭代中輸出切片索引for。這是輸出:
(0, 5)
(5, 10)
(10, 15)
(15, 20)
(20, 25)
(25, 30)
(30, 35)
(35, 40)
(40, 45)
(45, 50)
這表明迭代行所需的切片mat現在確實按預期生成。
關于將 2D 索引轉換為其 1D 平展等效項的注意事項
給定一個包含N行和M列的數組,將 2Dx,y索引轉換為其扁平化的 1D 等價物的一般公式i是:
i = x + M*y
您可以在這個舊線程中找到更深入的討論。
添加回答
舉報