我有两个2d数字列表。我想对它进行混洗,但只是在外面进行混洗。
如果我随机化排序列表a,我希望列表B遵循列表A的顺序。
我见过randomizing two lists and maintaining order in python,但这看起来不适合我。
下面的代码就是我现在所做的。
但对于大的麻木列表来说,它太慢了。
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)有没有更快或者更快的方法呢?
谢谢你的回答。
发布于 2018-12-30 00:04:48
您的想法是正确的,但是追加到数组非常耗时,因为它每次都会重新分配整个缓冲区。相反,您可以只使用随机索引:
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]发布于 2018-12-30 00:00:52
我不是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]这将比你拥有的更快,因为所有的append调用都会减慢你的速度。
发布于 2018-12-30 00:10:57
使用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]]https://stackoverflow.com/questions/53971040
复制相似问题