gpt4 book ai didi

python - 每行numpy的快速列洗牌

转载 作者:太空狗 更新时间:2023-10-29 18:02:24 26 4
gpt4 key购买 nike

我有一个包含行的 10,000,000+ 长度的大数组。我需要单独洗牌这些行。例如:

[[1,2,3]
[1,2,3]
[1,2,3]
...
[1,2,3]]

[[3,1,2]
[2,1,3]
[1,3,2]
...
[1,2,3]]

我正在使用

map(numpy.random.shuffle, array)

但这是一个 python(不是 NumPy)循环,它占用了我 99% 的执行时间。遗憾的是,PyPy JIT 没有实现 numpypy.random,所以我运气不好。有没有更快的方法?我愿意使用任何库(pandasscikit-learnscipytheano 等)作为只要它使用 Numpy ndarray 或衍生物。)

如果没有,我想我会求助于 Cython 或 C++。

最佳答案

这里有一些想法:

In [10]: a=np.zeros(shape=(1000,3))

In [12]: a[:,0]=1

In [13]: a[:,1]=2

In [14]: a[:,2]=3

In [17]: %timeit map(np.random.shuffle, a)
100 loops, best of 3: 4.65 ms per loop

In [21]: all_perm=np.array((list(itertools.permutations([0,1,2]))))

In [22]: b=all_perm[np.random.randint(0,6,size=1000)]

In [25]: %timeit (a.flatten()[(b+3*np.arange(1000)[...,np.newaxis]).flatten()]).reshape(a.shape)
1000 loops, best of 3: 393 us per loop

如果只有几列,那么所有可能的排列数远小于数组的行数(在这种情况下,当只有3列时,只有6种可能的排列)。一种使其更快的方法是首先一次进行所有排列,然后通过从所有可能的排列中随机选择一个排列来重新排列每一行。

即使在更大的维度上,它看起来仍然快 10 倍:

#adjust a accordingly
In [32]: b=all_perm[np.random.randint(0,6,size=1000000)]

In [33]: %timeit (a.flatten()[(b+3*np.arange(1000000)[...,np.newaxis]).flatten()]).reshape(a.shape)
1 loops, best of 3: 348 ms per loop

In [34]: %timeit map(np.random.shuffle, a)
1 loops, best of 3: 4.64 s per loop

关于python - 每行numpy的快速列洗牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com