简体   繁体   English

排列 2d numpy 数组中的整行

[英]Permuting entire rows in a 2d numpy array

Consider numpy array arr , shown below:考虑 numpy 数组arr ,如下所示:

    arr = ([[1, 5, 6, 3, 3, 7],
            [2, 2, 2, 2, 2, 2],
            [0, 1, 0, 1, 0, 1],
            [4, 8, 4, 8, 4, 8],
            [1, 2, 3, 4, 5, 6]])

I want to find all row permutations of arr .我想找到arr的所有行排列。 NOTE: the order of elements in any given row is unchanged.注意:任何给定行中元素的顺序是不变的。 It is the entire rows that are being permuted.正在排列的是整行。

Because arr has 5 rows, there will be 5. = 120 permutations.因为arr有5行,所以会有5.=120个排列。 I'm hoping these could be 'stacked' into a 3d array p , having shape (120, 5, 6):我希望这些可以“堆叠”到 3d 数组p中,形状为 (120, 5, 6):

p = [[[1, 5, 6, 3, 3, 7],
      [2, 2, 2, 2, 2, 2], 
      [0, 1, 0, 1, 0, 1],  
      [4, 8, 4, 8, 4, 8],
      [1, 2, 3, 4, 5, 6]],

     [[1, 5, 6, 3, 3, 7],
      [2, 2, 2, 2, 2, 2], 
      [0, 1, 0, 1, 0, 1],  
      [1, 2, 3, 4, 5, 6]
      [4, 8, 4, 8, 4, 8]],

       … etc …

     [[1, 2, 3, 4, 5, 6],
      [4, 8, 4, 8, 4, 8],
      [0, 1, 0, 1, 0, 1],  
      [2, 2, 2, 2, 2, 2], 
      [1, 5, 6, 3, 3, 7]]]

There is a lot of material online about permitting elements within rows, but I need help in permuting the entire rows themselves.网上有很多关于行内允许元素的资料,但我需要帮助自己排列整行。

You can make use of itertools.permutations and np.argsort :您可以使用itertools.permutationsnp.argsort

from itertools import permutations
out = np.array([arr[np.argsort(idx)] for idx in permutations(range(5))])

print(out)

[[[1 5 6 3 3 7]
  [2 2 2 2 2 2]
  [0 1 0 1 0 1]
  [4 8 4 8 4 8]
  [1 2 3 4 5 6]]

 [[1 5 6 3 3 7]
  [2 2 2 2 2 2]
  [0 1 0 1 0 1]
  [1 2 3 4 5 6]
  [4 8 4 8 4 8]]

 [[1 5 6 3 3 7]
  [2 2 2 2 2 2]
  [4 8 4 8 4 8]
  [0 1 0 1 0 1]
  [1 2 3 4 5 6]]

 ...

 [[1 2 3 4 5 6]
  [0 1 0 1 0 1]
  [4 8 4 8 4 8]
  [2 2 2 2 2 2]
  [1 5 6 3 3 7]]

 [[4 8 4 8 4 8]
  [1 2 3 4 5 6]
  [0 1 0 1 0 1]
  [2 2 2 2 2 2]
  [1 5 6 3 3 7]]

 [[1 2 3 4 5 6]
  [4 8 4 8 4 8]
  [0 1 0 1 0 1]
  [2 2 2 2 2 2]
  [1 5 6 3 3 7]]]

Similar answer, but you do not need to.argsort one more time类似的答案,但您不需要再进行一次 .argsort

from itertools import permutations
import numpy as np

arr = np.array([[1, 5, 6, 3, 3, 7],
                [2, 2, 2, 2, 2, 2],
                [0, 1, 0, 1, 0, 1],
                [4, 8, 4, 8, 4, 8],
                [1, 2, 3, 4, 5, 6]])
output = np.array([arr[i, :] for i in permutations(range(5))])
print(output)

[[[1 5 6 3 3 7]
  [2 2 2 2 2 2]
  [0 1 0 1 0 1]
  [4 8 4 8 4 8]
  [1 2 3 4 5 6]]

 [[1 5 6 3 3 7]
  [2 2 2 2 2 2]
  [0 1 0 1 0 1]
  [1 2 3 4 5 6]
  [4 8 4 8 4 8]]

 [[1 5 6 3 3 7]
  [2 2 2 2 2 2]
  [4 8 4 8 4 8]
  [0 1 0 1 0 1]
  [1 2 3 4 5 6]]

 ...

 [[1 2 3 4 5 6]
  [4 8 4 8 4 8]
  [2 2 2 2 2 2]
  [0 1 0 1 0 1]
  [1 5 6 3 3 7]]

 [[1 2 3 4 5 6]
  [4 8 4 8 4 8]
  [0 1 0 1 0 1]
  [1 5 6 3 3 7]
  [2 2 2 2 2 2]]

 [[1 2 3 4 5 6]
  [4 8 4 8 4 8]
  [0 1 0 1 0 1]
  [2 2 2 2 2 2]
  [1 5 6 3 3 7]]]

This is a bit faster, here are speed comparisons:这样比较快一些,下面是速度对比:

%%timeit
output = np.array([arr[i, :] for i in permutations(range(5))])
381 µs ± 14.9 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
%%timeit
output = np.array([arr[np.argsort(idx)] for idx in permutations(range(5))])
863 µs ± 97.7 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM