亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從概率矩陣中隨機選擇

從概率矩陣中隨機選擇

神不在的星期二 2021-09-11 17:56:41
我正在嘗試制作一個傳入消息的模擬器到輸出端口。我得到了輸入端口數 (N) 和輸出端口數 (M) 以及 N*M (mat) 概率的扁平矩陣。我還以數組(in_freq)的形式給出了傳入消息的數量。我想,為了將每條消息從輸入端口或輸出端口定向,我應該使用 numpy.random.choice,但沒有設法使其工作。我試過的是: for k in range (N):          enqueue = np.random.choice(M, in_freq[k], p=[(mat[k*N:k*N+M-1])])當 enqueue 是消息目的地的數組時。但是遇到了這樣的消息:ValueError:對象對于所需數組來說太深
查看完整描述

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

您可以在這個舊線程中找到更深入的討論。


查看完整回答
反對 回復 2021-09-11
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號