为了账号安全,请及时绑定邮箱和手机立即绑定

随机化两个列表(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 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号