我有两个2d numpy列表。我想对其进行洗牌,但只是对外部进行洗牌。
如果我将订单列表a随机化,我希望列表b跟随列表a的订单。
我见过randomizing two lists and maintaining order in 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或更快速的方式来做到这一点?
感谢您的回答。
答案 0 :(得分:3)
您的想法是正确的,但是追加到数组非常耗时,因为它每次都会重新分配整个缓冲区。相反,您可以只使用改组后的索引:
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]
答案 1 :(得分:1)
我的表现不是100%,但我认为这可能对您更好:
newa = np.copy(a)
np.random.shuffle(newa)
newb = np.copy(b)
np.random.shuffle(newb)
您是否需要它们具有相同的随机顺序?因此,如果元素1移动到newa
中的位置3,该移动是否还会在newb
中发生?这就是您的代码的方式,但是您没有在问题中指定。如果您希望两者都进行相同的混洗,则需要执行以下操作:
indexes = np.arrange(len(a))
np.random.shuffle(indexes)
newa = a[indexes]
newb = b[indexes]
这将比您拥有的速度更快,因为所有的附加调用都使您放慢速度。
答案 2 :(得分:1)
在numpy本身中使用shuffle选项,它将更加高效。
qcustomplot