考虑具有6列的numpy 2D阵列。我添加了空格以使数组行具有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行都包含相同的元素:[4,5, 6,7, 8,9]
a to f
[0,4, 0,4, 0,4]
我已经进行了实验np.lexsort
,并且可以基于进行单个元素排列sympy.utilities.iterables import multiset_permutations
,但是我确实受制于如何使用元素对排列来设置6个数组。
好吧,它并不优雅,我也不为此感到骄傲,但是这应该可以非常有效地为您提供预期的输出,而无需循环或置换。
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]]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句