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

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

隨機化兩個列表(numpy in)并在 python 中保持順序

隨機化兩個列表(numpy in)并在 python 中保持順序

揚帆大魚 2021-09-28 17:18:11
我有兩個 2d numpy 列表。我想洗牌,但只是外側洗牌。如果我隨機化訂單列表 a,我希望列表 b 遵循列表 a 的順序。我已經看到在 python 中隨機化兩個列表并維護順序,但這對我來說似乎不起作用。下面的代碼是我現在的做法。但是對于大的 numpy 列表來說太慢了。import numpy as npimport random    a = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])b = np.array([[100,200,300,400,500], [600,700,800,900,901], [101,102,103,104,105], [501,502,503,504,505]])r = [i for i in range(4)]random.shuffle(r)newa = np.empty((0, 3))newb = np.empty((0, 5))for rr in r:    newa = np.append(newa, [a[rr]], axis=0)    newb = np.append(newb, [b[rr]], axis=0)print(newa)print(newb)任何pythonic或更快的方法來做到這一點?
查看完整描述

3 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

您的想法是正確的,但是附加到數組非常耗時,因為它每次都會重新分配整個緩沖區。相反,您可以只使用洗牌索引:


a = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])

b = np.array([[100,200,300,400,500], [600,700,800,900,901], [101,102,103,104,105], [501,502,503,504,505]])


r = np.arange(4)

np.random.shuffle(r)


newa = a[r]

newb = b[r]


查看完整回答
反對 回復 2021-09-28
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

我不是 100% 的性能,但我認為這可能更適合你:


newa = np.copy(a)

np.random.shuffle(newa)

newb = np.copy(b)

np.random.shuffle(newb)

您是否需要它們處于相同的隨機順序?因此,如果元素 1 移動到位置 3,newa該移動是否也發生在newb?這就是您的代碼,但您沒有在問題中指定。如果您想對兩者進行相同的洗牌,則需要執行以下操作:


indexes = np.arrange(len(a))

np.random.shuffle(indexes)

newa = a[indexes]

newb = b[indexes]

這將比您擁有的更快,因為所有 append 調用都在減慢您的速度。


查看完整回答
反對 回復 2021-09-28
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

在 numpy 本身中使用 shuffle 選項,效率會更高。


np.random.shuffle(a)

np.random.shuffle(b)


print(a)

#

[[ 4  5  6]

 [10 11 12]

 [ 7  8  9]

 [ 1  2  3]]

print(b)

#

[[600 700 800 900 901]

 [100 200 300 400 500]

 [501 502 503 504 505]

 [101 102 103 104 105]]


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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