随机化两个列表(numpy in)并在 python 中保持顺序

我有两个 2d numpy 列表。我想洗牌,但只是外侧洗牌。


如果我随机化订单列表 a,我希望列表 b 遵循列表 a 的顺序。


我已经看到在 python 中随机化两个列表并维护顺序,但这对我来说似乎不起作用。


下面的代码是我现在的做法。


但是对于大的 numpy 列表来说太慢了。


import numpy as np

import 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或更快的方法来做到这一点?


扬帆大鱼
浏览 203回答 3
3回答

牧羊人nacy

您的想法是正确的,但是附加到数组非常耗时,因为它每次都会重新分配整个缓冲区。相反,您可以只使用洗牌索引: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]

陪伴而非守候

我不是 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 调用都在减慢您的速度。

慕森卡

在 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]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python