Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中随机化两个列表(numpy in)并保持顺序_Python_Numpy - Fatal编程技术网

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

在python中随机化两个列表(numpy in)并保持顺序,python,numpy,Python,Numpy,我有两个2d numpy列表。我想洗牌,但只是外侧洗牌 如果我将顺序列表a随机化,我希望列表b遵循列表a的顺序 我见过,但这看起来对我不起作用 下面的代码是我现在所做的 但是对于大型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,90

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

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

我见过,但这看起来对我不起作用

下面的代码是我现在所做的

但是对于大型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)
有没有什么蟒蛇式或更快的方法


谢谢您的回答。

我对性能不是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]

这将比您拥有的更快,因为所有的追加调用都会降低您的速度。

您的想法是正确的,但是追加到数组非常耗时,因为它每次都会重新分配整个缓冲区。相反,您可以只使用无序索引:

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]

在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]]

[i代表范围(4)]
->
列表(范围(4))
或者更好,
np.arange(4)
谢谢@madphestics。我认为我的代码逻辑从根本上是错误的。如果你的逻辑有效的话,它是正确的。只是效率有点低。我已经发布了我认为更好的方法;newb=b[r]。数组可以用while列表索引。谢谢@hpaulj!!谢谢你的回答。我编辑了我的问题。我想随机化列表a和列表b以遵循列表a的顺序。太好了!!这比我做的要快得多。谢谢!