如何将矩阵中的元素重新定位到另一行中的随机空位置?

How to relocate an element in a matrix to a random empty location in another row?

假设我有一个 5*5 矩阵。

[[1. 2. 3. 4. 5.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0]]

例如:

我想得到“4”,但“5”在它前面。我需要重新定位此处不需要的“5”,并将其放置在除之前所在行之外的任何随机可用位置。

所以重定位后矩阵应该是这样的

[[0. 1. 2. 3. 4.]
 [0. 0. 0. 0. 0.]
 [0. 5. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

如果我需要“3”,它应该将“4”和“5”重新定位到随机位置。

请帮我解决这个问题。谢谢

在这个答案中,我假设矩阵是作为列表的列表实现的,例如

a = [[1., 2., 3., 4., 5.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.]]

下面的函数

  • 接受两个参数,a,一个作为列表列表实现的二维矩阵,na[0]中的数字(即第一行 a) 你想右移到 a[0].

    的末尾
  • idx 被分配了 a[0] 中的索引,其中出现 n

  • 列表to_relocate中的元素是n右边a[0]中的所有元素。

  • a[0] = [0.] * (len(a[0]) - (idx + 1)) + a[0][:idx + 1] 向右移动 a[0] 的元素,用零填充左边。

  • 然后我们将 to_relocate 中的项目随机放置到 a 中除第 0 行之外的任何行中的元素。

  • 同时在集合do_not_remove中记录a中被to_relocate中元素替换的元素对应的索引,这样我们不要尝试在 a.

    中的同一位置放置多个 to_relocate 中的元素
from random import randrange
def change_random(n, a):
     # get index of n in a[0].
     idx = a[0].index(n)
     # values to relocate.
     to_relocate = a[0][idx + 1:]
     # shift a[0] right (filling left with zeros)
     a[0] = [0.] * (len(a[0]) - (idx + 1)) + a[0][:idx + 1]

     # records indices corresponding to elements of a 
     # that have already been replaced by elements in to_relocate.
     do_not_remove = set()
     for num in to_relocate:
          while True:
               # draw indices at random from set of valid indices (not row 0)
               ij = (randrange(1, len(a)), randrange(0, len(a[0])))
               # if element corresponding to ij has not been previously replaced, break
               if ij not in do_not_remove:
                    break
          do_not_remove.add(ij)
          a[ij[0]][ij[1]] = num

change_random(3, a)
print(a)

示例会话:

[[0.0, 0.0, 1.0, 2.0, 3.0],
 [4.0, 0.0, 0.0, 0.0, 0.0],
 [0.0, 0.0, 0.0, 0.0, 0.0],
 [0.0, 0.0, 0.0, 0.0, 0.0],
 [5.0, 0.0, 0.0, 0.0, 0.0]]