numpy 关于行元素的连续对的置换

kb5ga3dv  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(158)

考虑一个有6列的numpy二维数组,我添加了空格来说明数组行有3对元素。

import numpy as np

a = np.array([[1,2,  3,4,  2,5], 
              [4,5,  6,7,  8,9],
              [2,5,  1,3,  2,5],
              [0,4,  0,4,  0,4],
              [0,3,  1,7,  2,4]])

问题:我想生成5个新的数组b,c,d,e,f,所有数组的行数都与a相同,这些数组显示了数组a中每一行的对置换。每一对元素的顺序不变,但整个对都被置换了。这个数组有3对元素,因此6个阵列的第一行将各自保持不同的对置换[1,2, 3,4, 2,5]
因此,在该示例中,阵列a,b,c,d,e,f的第一行可以是:

[1,2, 3,4, 2,5],  [1,2, 2,5, 3,4],  [3,4, 1,2, 2,5],  [3,4, 2,5, 1,2],  [2,5, 1,2, 3,4], and [2,5, 3,4, 1,2]

数组a to f的第二行将包含[4,5, 6,7, 8,9]的六个对置换,依此类推。重要的是,数组行的每个新集合以相同的意义处理置换(即:订单)
数组a to f的第4行将全部保存相同的元素:[0,4, 0,4, 0,4]
我已经用np.lexsort做过实验,我可以处理基于sympy.utilities.iterables import multiset_permutations的单元素排列,但是我真的很困惑如何使用排列的元素对来设置6个数组

jslywgbw

jslywgbw1#

嗯,它并不优雅,我也不引以为豪,但它应该可以非常有效地得到预期的输出,而不需要循环或置换。

import numpy as np

a = np.array([[1,2,  3,4,  2,5], 
              [4,5,  6,7,  8,9],
              [2,5,  1,3,  2,5],
              [0,4,  0,4,  0,4],
              [0,3,  1,7,  2,4]])

b = np.flip(a.reshape(5,3,2), axis=1).reshape(5,-1) #swap last tuple for first and vice versa

np.hstack([a,
           np.roll(b, 2, axis=1),
           np.roll(b, 4, axis=1),           
           np.roll(a, 4, axis=1),
           np.roll(a, 2, axis=1),  
           b]).reshape(5,-1,6)
array([[[1, 2, 3, 4, 2, 5],  #Matches expected output
        [1, 2, 2, 5, 3, 4],
        [3, 4, 1, 2, 2, 5],
        [3, 4, 2, 5, 1, 2],
        [2, 5, 1, 2, 3, 4],
        [2, 5, 3, 4, 1, 2]],

       [[4, 5, 6, 7, 8, 9],
        [4, 5, 8, 9, 6, 7],
        [6, 7, 4, 5, 8, 9],
        [6, 7, 8, 9, 4, 5],
        [8, 9, 4, 5, 6, 7],
        [8, 9, 6, 7, 4, 5]],

       [[2, 5, 1, 3, 2, 5],
        [2, 5, 2, 5, 1, 3],
        [1, 3, 2, 5, 2, 5],
        [1, 3, 2, 5, 2, 5],
        [2, 5, 2, 5, 1, 3],
        [2, 5, 1, 3, 2, 5]],

       [[0, 4, 0, 4, 0, 4],   #Matches expected output
        [0, 4, 0, 4, 0, 4],
        [0, 4, 0, 4, 0, 4],
        [0, 4, 0, 4, 0, 4],
        [0, 4, 0, 4, 0, 4],
        [0, 4, 0, 4, 0, 4]],

       [[0, 3, 1, 7, 2, 4],
        [0, 3, 2, 4, 1, 7],
        [1, 7, 0, 3, 2, 4],
        [1, 7, 2, 4, 0, 3],
        [2, 4, 0, 3, 1, 7],
        [2, 4, 1, 7, 0, 3]]])

相关问题